我正在制作一个工具来解决 this尽管代码本身让我分心了。
在很多地方我都有返回(指向)数组的函数。大多数情况下,这些函数是递归的,在内部调用中创建的数组稍后可能无用。
我尝试使用 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>
的内容)。
PS:我的代码在 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 项目,发现 this :
delete[] slhs, srhs; //Deletes the now useless sorted arrays.
delete[] 不列出删除数组,据我所知只有 srhs 会被释放。你应该写:
delete[] srhs;
delete[] slhs;
寻找其他类似的地方,或使用 std::unique_ptr<>
关于c++ - 删除由函数创建的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36738046/