对 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++ 指针的怀疑的主要内容,如果未能解决你的问题,请参考以下文章

结构内分配内存的 C++ 使用情况

带有指针参数的 C++ 函数

c++野指针 之 实战篇

C++ 程序为某些输入抛出正确的答案,而为其他输入抛出错误的答案。我怀疑数据类型溢出

信仰与怀疑

对身份验证技术的怀疑 - 护照