c++ - 在 C++ 中实例化对象的正确方法是什么?

标签 c++ qt visual-c++ qt4

在 C++ 中(我使用 QT)我可以通过两种方式创建 QString 类的实例:

方法一

QString str = "my string";

方法二

QString *str = new QString("my string");

我知道这与指针有关。所以我的问题是:

  1. 两者有什么区别?
  2. 我应该坚持哪种方法?
  3. 什么时候使用方法 1 是正确的,什么时候使用方法 2 是正确的?
  4. 在方法 2 中,我可以通过调用 delete str; 来销毁对象。使用方法 1 时如何删除 str 变量?

谢谢

最佳答案

  1. 主要是它们具有不同的生命周期:在方法 2 中创建的对象将存在任意长的时间,直到您调用 delete;在方法 1 中,它将在堆栈上创建并在函数调用返回时销毁(如果有)。其次,方法 2 需要更多工作,因为内存管理非常重要。

  2. 使用与您想要的生命周期相匹配的方法。如果方法 1 的生命周期对您来说足够好,则不要使用方法 2,因为它需要内存管理的开销。如果您可以重组您的程序,以便在使用方法 1 的同时改进设计,那将更加高效和优雅。

  3. 见上文 2。特别是,使用方法 1 并存储指向对象的指针并在其生命周期后访问它是一个陷阱。这对于方法 2 也是可能的,但是显式销毁将程序员的注意力集中在它上面(但仍然因为生命周期并不简单,它可能是一个陷阱)方法 2 的一个陷阱是忘记删除它导致内存泄漏(或删除它)为时过早,如本段前面所述提及它)

  4. 在方法 1 中,当函数返回时,对象将被自动删除。

关于c++ - 在 C++ 中实例化对象的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8439869/

相关文章:

c++ - 使用线程时的内存分配问题

c++ - Qt:如何让 QImage 知道更新的内存缓冲区?

c++ - 阻止写入 C++ Qt Qt5.0 中的控制台

qt - 子类化QMessageBox

c++ - 参数问题帮助

c++ - 使用 opencv 显示视频

C++ 指向字节数组优化的指针

c++ - emacs C/C++ 缩进 : different for pre and post comments//or: how can I make certain comments like//^ be indented extra?

c++ - 确定调用者是从 EXE 还是 DLL 调用

c++ - 我如何制作原始类型 C++ 的拷贝?