如何删除函数返回的数组
How to delete an array that a function returns
我是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]
行使用的内存从未被释放。
希望这是有意义的,我很抱歉,如果这是一个愚蠢的问题,感谢阅读!
要完全删除数组,包括其中的子数组,您可以执行以下操作:
// Assuming we have an array called 'array'
int** array = foo(bar);
// Iterate through all the sub-arrays and delete them
for (int i = 0; i < sizeOfArray; i++) {
delete [] array[i];
}
// Delete the primary array
delete [] array;
这段代码有一些风格问题,有些人可能会试图告诉你永远不要使用原始指针,但我只是想以一种直截了当的方式为你回答这个问题。
基本上与创建数组的操作顺序相反。首先创建外部数组,然后遍历并创建子数组,要删除,需要先删除子数组,然后删除最外层的数组。
这不是很好的c++,我不记得上次在数组上使用new和delete是什么时候了,那是很久以前的事了。但是,当你学习的时候,你需要知道它是如何工作的,所以继续努力,祝你好运!
以下是int
s数组的相关代码:
int* foo = new int[20];
// free the array
delete [] foo;
对于初学者来说,必须按照相对于其分配的相反顺序删除指针。
你可以用下面的方法写一个函数来完成这个任务
void free( int **array, int sizeOfArray )
{
for ( int i = 0; i < sizeOfArray; i++ )
{
delete [] array[i];
}
delete [] array;
}
也可以定义为
void free( int ** &array, int sizeOfArray )
{
for ( int i = 0; i < sizeOfArray; i++ )
{
delete [] array[i];
}
delete [] array;
array = nullptr;
}
您可以使用标头<vector>
std::vector
来代替自己分配和释放内存。例如你的数组可以定义为
std::vector<std::vector<int>> array( sizeOfArray, std::vector<int>( 2 ) );
在这种情况下,您不需要为释放内存而烦恼。
这个问题的标准解决方案是首先不要走这条路。
std::vector
是一站式商店,为您的所有动态数组的需求和std::array
代表静态数组。总之,我们得到了一个不错的二维数组,它恰好在内存中是连续的,并且在它超出作用域的那一刻将被释放。
#include <vector>
#include <array>
std::vector<std::array<int, 2>> foo(int sizeOfArray){
return std::vector<std::array<int, 2>>(sizeOfArray);
}
int main() {
int a = 50; // your number here
std::vector<std::array<int, 2>> someArray = foo(a);
// Do stuff with someArray
} //someArray goes out of scope and is destoyed, freeing all of the allocated memory
参见'deleteArray'函数。你必须先删除子数组。然后删除顶层数组。学习记忆管理是一项很好的技能。一旦你学习了内存管理(使用"new"answers"delete"),你应该学习STL容器。在实践中,人们会使用STL。
我还添加了一个打印功能,这样你就可以看到它是什么样子了。
#include <iostream>
int** foo(int sizeOfArray){
int** arrayToReturn = new int*[sizeOfArray];
for (int i = 0; i < sizeOfArray; i++) {
arrayToReturn[i] = new int[2];
for (int j = 0; j < 2; j++){
arrayToReturn[i][j] = j;
}
}
return arrayToReturn;
}
void printArray(int **array, int sizeOfArray){
for(int i = 0; i < sizeOfArray; i++){
for(int j = 0; j < 2; j++){
std::cout << array[i][j] << " ";
}
std::cout << std::endl;
}
}
void deleteArray(int **array, int sizeOfArray){
// Do the inverse of foo
// Delete the sub arrays (ones with size 2)
for(int i = 0; i < sizeOfArray; i++){
delete [] array[i];
}
// Then delete the entire array
delete [] array;
}
int main(){
int a = 34;
int **someArray = foo(a);
printArray(someArray, a);
std::cout << someArray << std::endl;
// Delete pieces of memory
deleteArray(someArray, a);
// Readability as well. Set our local reference to NULL
// Also, will make sure we can't use someArray elsewhere
someArray = NULL;
// This 'printArray' call would cause a segfault
// printArray(someArray, a);
return 0;
}
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量