如何清理 std::vector<int*> 而不会出现 _CrtDumpMemoryLeaks() 报告的内存泄漏

问题描述 投票:0回答:2

我遇到了一个问题,即我无法正确释放内存。我有一个

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

请帮助我正确地释放内存

c++ pointers visual-c++ memory-leaks stdvector
2个回答
1
投票

我假设您的

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>


0
投票

_CrtDumpMemoryLeaks();
看不到未来。它仍然会看到仍在范围内的向量本身。请注意,
std::vector::clear
保持向量的容量不变。因此,您看到的“泄漏”是向量分配的内存。

从某种意义上说,什么是“内存泄漏”,什么不是“内存泄漏”,取决于解释。有时您确实希望某些东西“泄漏”到示波器之外。考虑一个工厂函数,它在内部分配一些对象并 返回它。工厂本身不会删除该对象,而是将其“泄漏”到外部。您不希望泄漏的范围是

main
,或其他一些函数,由于代码的逻辑,您知道该函数将清理它分配的任何内容(工具无法知道这一点)。

将代码更改为:

int main() {
    {
        // ... do it all here ...
    } // <- does something leak this scope ?
    _CrtDumpMemoryLeaks();
}

该工具仅检测是否仍分配一些内存。只有你知道,在你测量的时候,所有的东西都应该已经清理干净了。

© www.soinside.com 2019 - 2024. All rights reserved.