我遇到了一个问题,即我无法正确释放内存。我有一个
int*
类型的向量并且
分配内存并将这些指针添加到我的向量后,我只想释放内存并结束程序。
std::vector<int*> students;
students.push_back(new int);
students.push_back(new int);
students.push_back(new int);
students.push_back(new int);
students.push_back(new int);
students.push_back(new int);
students.push_back(new int);
for (const auto& student : students) {
delete student;
}
students.clear();
_CrtDumpMemoryLeaks();
但是,我从 Visual Studio 2022 中得到以下输出:
Detected memory leaks!
Dumping objects ->
{170} normal block at 0x000001C4AAE05BF0, 72 bytes long.
Data: <# # > 23 81 00 00 00 00 00 00 23 81 00 00 00 00 00 00
{157} normal block at 0x000001C4AAE11E80, 16 bytes long.
Data: < u: > C8 F5 75 3A AF 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.
我就是不明白。首先,我遇到了比这个更复杂的项目(项目由类和其他东西组成)这个问题,我认为内存泄漏的问题可能是在析构函数或 idk 中的某个地方,但是.. idk ...... 附注为了检测内存泄漏,我使用 crtdbg.h
请帮助我正确地释放内存
我假设您的
vector
测试代码是在您最后调用 _CrtDumpMemoryLeaks()
的同一函数中编写的。
vector
保证仅在析构函数中释放其内部内存,在您的情况下,只有当它超出范围时才会调用它。
将测试代码移至单独的函数中,您将观察到没有泄漏:
#include <vector>
void test()
{
std::vector<int*> students;
students.push_back(new int);
students.push_back(new int);
students.push_back(new int);
// ...
for (const auto& student : students) {
delete student;
}
students.clear();
} // here the vector's destructor will be called and release the internal momory
int main() {
test();
_CrtDumpMemoryLeaks();
}
注意,在这种情况下并不真正需要调用
students.clear()
,因为析构函数将处理与资源清理相关的所有事情。
旁注:除了教育目的之外,将
int*
存储在 vector
中并不是一个好的做法。如果您想保留“null”/空选项,请存储 int
或 std::optional<int>
。
_CrtDumpMemoryLeaks();
看不到未来。它仍然会看到仍在范围内的向量本身。请注意,std::vector::clear
保持向量的容量不变。因此,您看到的“泄漏”是向量分配的内存。
从某种意义上说,什么是“内存泄漏”,什么不是“内存泄漏”,取决于解释。有时您确实希望某些东西“泄漏”到示波器之外。考虑一个工厂函数,它在内部分配一些对象并 返回它。工厂本身不会删除该对象,而是将其“泄漏”到外部。您不希望泄漏的范围是
main
,或其他一些函数,由于代码的逻辑,您知道该函数将清理它分配的任何内容(工具无法知道这一点)。
将代码更改为:
int main() {
{
// ... do it all here ...
} // <- does something leak this scope ?
_CrtDumpMemoryLeaks();
}
该工具仅检测是否仍分配一些内存。只有你知道,在你测量的时候,所有的东西都应该已经清理干净了。