c++ - 删除由函数创建的数组

标签 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因为重写所有相关代码似乎是一项重大任务,而且因为作为一名新手,我知道我不需要图书馆的帮助来编写我的程序感觉好多了(显然我仍在使用它们;我无法想象什么例如写类似 <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/

相关文章:

ios - 无限内存增长 - iOS

memory-management - 实时系统中的 FFMPEG,内存分配问题

c++ - Obj-C-C++ 中的 OpenCV goodFeaturesToTrack

c++ - C++11 中的正则表达式与 PHP

ios - 优化捕获列表

android - 描述Android中的 "top"命令

c++ - Boost ptree 顶级数组

c++ - 检查一个对象的类是否派生自 C++ 中另一个对象的类

c++ - 程序动画(在调试器中逐步/单步执行)是如何实现的? (例如在 VSC++ 中)

c - C 数组在内存中是如何表示的?