删除函数创建的数组

时间:2016-04-20 08:29:48

标签: c++ memory-management

我正在制作一个解决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:我为我的英语道歉;不是母语。

1 个答案:

答案 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<>