我正在制作一个解决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
,因为重写所有相关代码似乎是一项重大任务,因为作为一名新手,我觉得我不需要图书馆,感觉更好#39;帮助编写我的程序(显然我仍然使用它们;我无法想象编写类似<iostream>
之类的内容)。
PS:我在GitHub上的代码。
PPS:我为我的英语道歉;不是母语。答案 0 :(得分:1)
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<>