删除函数创建的数组
Deleting an array created by a function
我正在制作一个工具来解决这个问题,尽管我被代码本身严重偏离了方向。
在不同的地方,我都有返回(指向)数组的指针的函数。大多数情况下,这些函数是递归的,在内部调用中创建的数组以后可能毫无用处。
我尝试使用delete[]
;尽管编译器没有抱怨,程序运行良好,但我可以看到分配了大量内存。代码看起来像这样:
template <typename Type> Type* foo(unsigned short size,...)
{
//...
Type *tmp;
//...
tmp=foo(param,...);
//...
delete[] tmp;
//...
}
然后我问自己,当数组在作用域之外创建时,delete[]
是否真的删除了所有分配的内存,或者只删除了第一个索引(或者什么都不删除?)。
我把那段代码改写成这样:
template <typename Type> Type* foo(unsigned short size,...)
{
//...
Type *tmp;
//..
tmp = new Type[i];
tmp = foo(param,...);
//...
delete[] tmp;
//...
}
内存消耗降低了,但我很快意识到,我在调用foo(...)
之前创建的数组实际上并没有被删除。。。曾经
所以最后我尝试了:
template <typename Type> Type* foo(unsigned short size,...)
{
//...
Type *tmp, *dump;
//..
dump = tmp = new Type[i];
tmp = foo(param,...);
delete[] dump;
//...
delete[] tmp;
//...
}
但我只是将问题向前推进了一步,并在创建另一个数组的过程中。不出所料(虽然不是真的)内存消耗飙升。
这里的问题是:
- 我该如何解决此问题
- 为什么第一次更改会降低内存消耗
我真的不想使用std::vector
,因为重写所有相关的代码似乎是一项主要任务,而且作为一名新手,我知道自己不需要库的帮助来编写程序,感觉好多了(显然我仍然在使用它们;例如,我无法想象写<iostream>
这样的东西会发生什么)。
附言:我在GitHub上的代码。
PPS:我为我的英语道歉;不是母语人士。
What is the correct way to do this?
你应该把new T[]
和delete[]
配对——这里没有魔法。为了确保正确执行,请使用std:unique_ptr<T[]>
版本的数组。或者-std::vector,但你说你不喜欢它。
Why did memory consumption lowered with the first change?
似乎不合逻辑,你分配了更多的内存,它就掉了。。。。
我看了一下你的github项目,发现了这个:
delete[] slhs, srhs; //Deletes the now useless sorted arrays.
delete[]没有列出delete数组,据我所知,只有srhs会被释放。你应该写:
delete[] srhs;
delete[] slhs;
找到其他类似的位置,或使用std::unique_ptr<>
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为