返回结果后返回指向 new[] 数组的指针值的函数是否会泄漏内存?

问题描述

我读过我们需要在将指针指向使用关键字“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