问题描述
我读过我们需要在将指针指向使用关键字“new”创建的值地址后删除指针。但是我需要获取数组内部的值并将其返回给一个变量,所以我写了这个函数:
GLfloat VertexArray(Vertex<GLfloat> v1,Vertex<GLfloat> v2,Vertex<GLfloat> v3) {
GLfloat *ArrayPtr = new GLfloat[24]{ v1.x,v1.y,v1.z,v1.w,v1.r,v1.g,v1.b,v1.a,v2.x,v2.y,v2.z,v2.w,v2.r,v2.g,v2.b,v2.a,v3.x,v3.y,v3.z,v3.w,v3.r,v3.g,v3.b,v3.a };
return *ArrayPtr;
};
这不好吗?如果是这样,有没有更好的方法来返回整个数组?
解决方法
是的,这很糟糕。这是内存泄漏,因为分配的数组永远不会被删除(如您所说)。
这是一个不会泄漏的版本
GLfloat VertexArray(Vertex<GLfloat> v1,Vertex<GLfloat> v2,Vertex<GLfloat> v3) {
return v1.x;
};
您编写的函数不需要分配,因为您返回的唯一值是数组中的第一个值,即 v1.x
。
现在这是一个相当无意义的函数,所以也许你的真实代码比你发布的代码更复杂。
也许您打算编写一个返回整个数组的函数。在这种情况下,返回您分配的指针 return ArrayPtr;
。在这种情况下,您仍然需要删除指针,但您可以在调用此函数的代码中的某处执行此操作。
是的,它肯定会泄漏。
您动态分配和初始化 24 个浮点数,然后只使用它们中的第一个作为结果 (final Set<String> isoCountries = Set.of(Locale.getISOCountries());
String country = "DZ";
if (!isoCountries.contains(country.toUpperCase())) {
throw new IllegalArgumentException(country + " country code not valid.");
}
),不再考虑之前分配的数组。
我不知道您的意图,但我猜想,如果您的函数构建了这样一个数组,您希望获得它作为结果。
*ArrayPtr