【发布时间】:2017-03-22 18:23:53
【问题描述】:
我是 C++ 新手,我遇到了一个小的内存泄漏问题。我的程序结构很简单,如下图,虽然我省略了与问题无关的部分。
int** foo(int sizeOfArray){
int** arrayToReturn = new int*[sizeOfArray];
for (int i = 0; i < sizeOfArray; i++) {
arrayToReturn[i] = new int[2];
}
return arrayToReturn;
}
int main() {
a = someNumber; // 'a' can be any value ( < 64)
int** someArray = foo(int a);
// Do stuff with someArray
}
所以本质上,它调用了一个返回数组数组的函数。我的问题是,当我的程序调用这个函数数千次时,它们会导致内存泄漏,因为我使用的是 NEW,所以我需要使用 delete。我只是不确定如何删除数组,因为我需要在主函数中使用它们,所以我不能在函数 foo 中删除它们,但是之后如何删除它们?我尝试只删除someArray,但是从arrayToReturn[i] = new int[2] 行用完的内存永远不会被释放。
希望这是有道理的,如果这是一个愚蠢的问题,我很抱歉,感谢阅读!
【问题讨论】:
-
不要使用原始指针,使用像 'std::unique_ptr' 这样的 c++ 指针类。此外,如果这就是你真正想要的,那么使用 std::vector<:pair int>> 而不是自己做也会好得多
-
我从未使用过vector或unique_ptr,一旦超出范围,它们会自行释放吗?它们易于学习使用吗?有没有办法用原始指针实现我想要的?
-
@MatthewFennell 两者都比学习手动内存管理容易得多。
-
@MatthewFennell:编译器会插入对复制构造函数和析构函数的正确调用,使它们的使用像使用整数一样简单。然后,两个析构函数(vector 和 unique_ptr)都会清理托管资源。使用原始指针,您必须调用正确的析构函数,事实证明人类不像编译器那样擅长记账。
标签: c++ arrays memory heap-memory