删除函数创建的数组

Deleting an array created by a function

本文关键字:数组 创建 函数 删除      更新时间:2023-10-16

我正在制作一个工具来解决这个问题,尽管我被代码本身严重偏离了方向。

在不同的地方,我都有返回(指向)数组的指针的函数。大多数情况下,这些函数是递归的,在内部调用中创建的数组以后可能毫无用处。

我尝试使用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<>