删除智能指针的内存释放不起作用[重复]

Posted

技术标签:

【中文标题】删除智能指针的内存释放不起作用[重复]【英文标题】:Memory deallocation with deleting smart pointer does not work [duplicate] 【发布时间】:2019-11-28 08:47:50 【问题描述】:

我用具有大数组指针的类的共享指针声明并分配向量指针。 通过删除向量指针,我希望从大数组中释放内存。我的问题是为什么在'return 0'之前'delete vec'之后的正确时刻没有释放内存。在调试模式下,您可以在窗口任务管理器中看到它。请让我知道为什么“删除 vec”不能按我的预期工作。

class test

public:
    test()  A = new double[500000000]; 
    ~test()  delete[] A; 
    double *A;
;

int main()

    vector<shared_ptr<test>> *vec =new vector<shared_ptr<test>>();
    vec->push_back(shared_ptr<test>(new test()));
    vec->push_back(shared_ptr<test>(new test()));
    vec->push_back(shared_ptr<test>(new test()));

    delete vec;

    return 0;

【问题讨论】:

见***.com/questions/4172722/what-is-the-rule-of-three 容器指针几乎没有用例。除非您需要多态性,否则通常也不需要指向对象的指针。所以你可以改用std::vector&lt;test&gt; vec test(), test(), test() ;。您可以将向量放在嵌套范围内,以模拟向量的动态分配和删除。它实际上也会有同样的问题(rule of three/five/zero 没有被关注)。 @Jungwoong 为什么需要为 3 个指针(即std::vector)动态分配内存? std::vector 的数据缓冲区将始终动态分配,无论 std::vector 变量是在堆栈上还是在堆上。 此外,Windows 任务管理器并不会真正告诉您您的 C++ 程序是否存在内存泄漏。当一个程序向操作系统请求内存时,它通常不会把它还给它,除非它真的必须这样做。您正在正确释放所有数据,但这并不意味着任务管理器中的内存使用量必须下降。 你的程序绝对没问题!内存管理按预期工作。你唯一的问题是你从你的操作系统中观察和解释错误的信息。我真的很想知道为什么人们用三规则发表评论,而其他人则投赞成票。只要您的测试类不会被复制和移动,就可以了。如果要将测试类直接存储在向量中,则必须注意向量实现可能会移动必须处理的数据。对于大型阵列,它应该是可移动的。如果是这样,我们的规则是五而不是三:-) 【参考方案1】:

我测试了你的代码,删除ptr时没有问题。

【讨论】:

感谢您的回复。请看我上面的评论..

以上是关于删除智能指针的内存释放不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

free() 在 c 代码和代码中收集垃圾值即使在释放后将指针设置为 NULL 也不起作用

为啥在javascript中删除对象不起作用[重复]

智能指针简介

Android数据库选择查询不起作用(空指针错误)[重复]

C. 函数中的 malloc() 和 free() 不起作用 [重复]

C++面经漏洞汇总