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

C++ memory leak when creating an array

本文关键字:内存 泄漏 c++ 数组 创建      更新时间:2023-10-16

在我的c++游戏中,我有一个指向EnemyType s的指针数组。我使用可视化泄漏检测器来检测内存泄漏,它告诉我在以下代码段中有泄漏:

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

在这种情况下,我们设number_of_lines是3。我怎么可能在这里制造了一个漏洞呢?我能做点什么吗?

我开始学习c++大约一个月前,我仍然每天学习,但我不能理解一些东西(像这样)没有人解释我。

EDIT:我已经修改了代码,使用向量而不是普通数组。

从原始代码:

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

当你在c++中使用new分配内存时,你必须使用delete(或delete[]当你分配一个数组时,如enemyTypes)来释放它。

我们只看到你的部分代码,但是我猜当你不再需要内存时,你没有做任何释放。

顺便说一下,您应该避免分配内存,或者通过托管指针分配内存:
#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库中的智能指针。当对象不再使用时,它们会自动删除,从而避免内存泄漏。

原来我从来没有释放内存(正如其他人告诉我的),但是视觉泄漏检测器只是告诉我内存分配的位置,而不是泄漏发生的位置。