删除智能指针的内存释放不起作用[重复]
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<test> vec test(), test(), test() ;
。您可以将向量放在嵌套范围内,以模拟向量的动态分配和删除。它实际上也会有同样的问题(rule of three/five/zero 没有被关注)。
@Jungwoong 为什么需要为 3 个指针(即std::vector
)动态分配内存? std::vector
的数据缓冲区将始终动态分配,无论 std::vector
变量是在堆栈上还是在堆上。
此外,Windows 任务管理器并不会真正告诉您您的 C++ 程序是否存在内存泄漏。当一个程序向操作系统请求内存时,它通常不会把它还给它,除非它真的必须这样做。您正在正确释放所有数据,但这并不意味着任务管理器中的内存使用量必须下降。
你的程序绝对没问题!内存管理按预期工作。你唯一的问题是你从你的操作系统中观察和解释错误的信息。我真的很想知道为什么人们用三规则发表评论,而其他人则投赞成票。只要您的测试类不会被复制和移动,就可以了。如果要将测试类直接存储在向量中,则必须注意向量实现可能会移动必须处理的数据。对于大型阵列,它应该是可移动的。如果是这样,我们的规则是五而不是三:-)
【参考方案1】:
我测试了你的代码,删除ptr时没有问题。
【讨论】:
感谢您的回复。请看我上面的评论..以上是关于删除智能指针的内存释放不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
free() 在 c 代码和代码中收集垃圾值即使在释放后将指针设置为 NULL 也不起作用