【问题标题】:Doubts about C++ pointers对 C++ 指针的怀疑
【发布时间】: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 的调用的消费函数。

标签: c++ qt pointers


【解决方案1】:

您在这里使用 C++,如果您不这样做,没有人会删除您的对象。您编写的每个new 都要求您编写一个delete 来释放内存(就像在C 中每个malloc 都需要一个free)。

只有对象被删除:

void foo()
{
    MyClass myClass;
    myClass.doSomething();
}

然后MyClass 的析构函数在 foo 返回时被调用。一般来说,除非您需要对象在您的范围之外持久化,否则首选对象而不是指针,这将防止代码中的内存泄漏。

需要考虑的特殊情况:

注意:对于 QThread,您应该要求在完成后将其删除。见When or how to delete QThread in Qt

【讨论】:

  • 您应该告诉 OP 在可能的情况下(即几乎总是)更喜欢 unique_pointer 而不是 shared_pointer。另外,在不必要的时候完全避免使用指针。
  • 感谢您的回答。在 bar 函数中,我正在创建一个指向线程对象的指针。我应该仅在线程完成时删除此指针,对吗?然后我需要在全局范围内声明指针可以被其他函数访问(例如getResult(double))?
  • @KelvinSalton:GUI 框架通常会执行自定义内存处理。在这种情况下,您应该始终遵循框架的最佳实践和文档,而不是尝试使用智能指针进行干预。同时,您不能假设 GUI 框架通常代表 C++ 内存管理。