对 C++ 指针的怀疑
Posted
技术标签:
【中文标题】对 C++ 指针的怀疑【英文标题】:Doubts about C++ pointers 【发布时间】:2017-02-08 19:58:56 【问题描述】:foo
函数完成后,myClass
指针会发生什么情况?会自动删除吗?
bar
函数完成后,myThread
指针会发生什么情况? (假设myThread
指向一个QThread
对象)
void foo()
MyClass *myClass = new MyClass();
myClass->doSomething();
void bar()
// Suppose that MyThread is a QThread class
MyThread* myThread = new MyThread(2.5);
// Connect the Thread to get the result
connect(myThread, SIGNAL(sendResult(double)), this, SLOT(getResult(double)));
// Start the thread
myThread->start();
提前致谢
【问题讨论】:
当你用new
实例化一个对象时,它会一直存在直到delete
被调用。由于您使用的是原始指针,因此它们将一直存在,直到您自己调用 delete
或将它们传递给包含对 delete
的调用的消费函数。
【参考方案1】:
您在这里使用 C++,如果您不这样做,没有人会删除您的对象。您编写的每个new
都要求您编写一个delete
来释放内存(就像在C 中每个malloc
都需要一个free
)。
只有对象被删除:
void foo()
MyClass myClass;
myClass.doSomething();
然后MyClass
的析构函数在 foo 返回时被调用。一般来说,除非您需要对象在您的范围之外持久化,否则首选对象而不是指针,这将防止代码中的内存泄漏。
需要考虑的特殊情况:
如果您使用std::shared_ptr 甚至unique_ptr,对象可能会被自动删除(参见Differences between unique_ptr and shared_ptr)。 Qt 对象可以在不通知您的情况下自动删除它的子对象。请参阅:Memory management in Qt?(对于任何支持对象父级的 SDK 都可能相同)。 ....所以,正如 Christian 所说,您不想将这两种解决方案混合在一起注意:对于 QThread,您应该要求在完成后将其删除。见When or how to delete QThread in Qt。
【讨论】:
您应该告诉 OP 在可能的情况下(即几乎总是)更喜欢 unique_pointer 而不是 shared_pointer。另外,在不必要的时候完全避免使用指针。 感谢您的回答。在 bar 函数中,我正在创建一个指向线程对象的指针。我应该仅在线程完成时删除此指针,对吗?然后我需要在全局范围内声明指针可以被其他函数访问(例如getResult(double))? @KelvinSalton:GUI 框架通常会执行自定义内存处理。在这种情况下,您应该始终遵循框架的最佳实践和文档,而不是尝试使用智能指针进行干预。同时,您不能假设 GUI 框架通常代表 C++ 内存管理。以上是关于对 C++ 指针的怀疑的主要内容,如果未能解决你的问题,请参考以下文章