繁体   English   中英

创建数组时C ++内存泄漏

[英]C++ memory leak when creating an array

在我的C ++游戏中,我有一个指向EnemyType的指针数组。 我使用Visual Leak Detector来检测内存泄漏,并告诉我以下代码段中存在泄漏:

vector<EnemyType*> enemyTypes(number_of_lines);

for (int i = 0; i < number_of_lines; i++)
{
    enemyTypes[i] = new EnemyType();
}

假设在这种情况下number_of_lines为3。 我怎么可能在这里制造泄漏? 我可以做些什么吗?

我大约一个月前开始学习C ++,但我仍然每天都在学习,但是如果没有人向我解释,我将无法理解某些东西(像这样)。

编辑:我已经修改了代码以使用向量而不是纯数组。

从您的原始代码:

EnemyType** enemyTypes{ new EnemyType*[number_of_lines] };

for (int i = 0; i < number_of_lines; i++)
{
    enemyTypes[i] = new EnemyType();
}

当您使用new在C ++中分配内存时,必须使用delete (或在分配数组(例如enemyTypes )时使用delete[]来取消分配内存。

我们只看到部分代码,但是我想当您不再需要内存时,您就不会进行任何释放。

顺便说一句,您应该避免分配内存,或者通过托管指针分配内存:

#include <vector>
#include <memory>

// ...

std::vector<std::unique_ptr<EnemyType>> enemy_types(number_of_lines);

for (auto& enemy_type : enemy_types)
{
    enemy_type = std::make_unique<EnemyType>();
}

根据使用数据的方式,甚至可以避免使用指针:

std::vector<EnemyType> enemy_types(number_of_lines);

运算符new动态分配内存。

最终,一些代码需要使用相应的运算符delete释放该内存。 如果您的代码不这样做,则永远不会释放内存。 如果您的程序失去跟踪(例如,用于保存new结果的指针不再存在),那将成为泄漏。

稍作修改的代码版本

int func()
{
    EnemyType** enemyTypes{ new EnemyType*[number_of_lines] };

    for (int i = 0; i < number_of_lines; i++)
    {
         enemyTypes[i] = new EnemyType();
    }
}

当函数返回时,指针enemyTypes不再存在(因为它超出了范围)。 结果是,第一次使用运算符new创建的内存永远不会释放,并且不存在指向它的指针。 由于无法访问该内存,因此也无法访问循环中new运算符的结果(因为存储这些结果的唯一位置是在enemyTypes标识的动态分配的数组中)。

因此,所有内存在那一刻都会泄漏(除非您使用标准C ++范围以外的技术,否则程序无法恢复动态分配的内存)。 各种内存检查器(如果使用它们)将在函数返回时或程序终止时相应地报告泄漏。

使用new运算符时,请确认已删除创建的每个对象。

一个很好的选择是使用STL或boost库中的智能指针。 当对象变得不使用时,它们将自动删除您的对象,从而避免内存泄漏。

原来我从来没有释放过内存(就像其他人告诉我的那样),但是Visual Leak Detector只是向我显示了该内存的分配位置,而不是泄漏发生的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM