创建数组时c++内存泄漏
C++ memory leak when creating an array
在我的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库中的智能指针。当对象不再使用时,它们会自动删除,从而避免内存泄漏。
原来我从来没有释放内存(正如其他人告诉我的),但是视觉泄漏检测器只是告诉我内存分配的位置,而不是泄漏发生的位置。
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏