哪种方法可以在C ++中实例化对象?
在C ++中(我使用QT)我可以通过两种方式创建一个QString类的实例:
方法1
QString str = "my string";
方法2
QString *str = new QString("my string");
我知道这是用指针做的。 所以我的问题是:
delete str;
来销毁对象delete str;
。 如何在使用方法1时删除str
变量? 谢谢
主要是它们有不同的生命周期:在方法2中创建的对象将生存任意长,直到你调用delete; 在方法1中,它将在堆栈上创建,并在函数调用返回时销毁(如果有的话)。 其次方法2需要更多的工作,因为不重要的内存管理。
使用匹配你想要的生命期的方法。 如果方法1的生命周期足够好,不需要使用方法2,因为它需要内存管理的开销。 如果您可以重新构建程序,以便您可以使用方法1,同时改进设计,那将更加高效和优雅。
见上面2.。 特别是使用方法1并存储指向该对象的指针并在其生命周期后访问它是一个陷阱。 方法2也可以这样做,但是明确的销毁会将程序员的注意力集中在它上面(但仍然是因为生命并不简单,这可能是一个陷阱)方法2的一个缺陷是忘记删除它导致内存泄漏(或删除它太早,并按照本段前面的描述提及它)
在方法1中,当函数返回时,对象将被自动删除。
两者是完全不同的东西。
QString str("my string");
创建一个自动管理其生命周期的对象:该对象要么位于其封闭作用域的末尾(如果它是局部变量),要么位于程序的末尾(如果它是全局变量)。
new QString("my string");
创建一个具有手动管理生命周期的对象,也称为“动态对象”(并返回指向此对象的指针)。 这意味着你负责管理对象的生命周期。 除非您正在编写库组件,否则这几乎从来都不是正确的做法。
这就是C ++哲学的核心:C ++是图书馆写作的语言。 您拥有编写高质量,可重用组件的工具。 如果当你这样做时,你需要知道终身管理的复杂性。 但是,直到这个时候,你应该使用现有的库组件。 这样做时,你会发现几乎从不需要执行任何手动管理。
使用动态容器(矢量,字符串,地图等)来存储数据并构建自己的数据结构。 如果您需要修改调用者范围中的对象,则通过引用传递参数。 从更简单的组件构建复杂的类。 如果您确实必须拥有动态对象,请通过unique_ptr<T>
或shared_ptr<T>
处理程序类来处理它们。
不要使用指针。 很少使用new
,并从不delete
。
(进一步提示:1)除非用于ADL,否则不要使用using namespace
。 2)除非你正在编写库组件,否则精心设计的类不应该有析构函数,复制构造函数或赋值运算符。 如果他们这样做,将违规逻辑分解为单个责任库组件,然后参见2)。)
当您使用第一种语法时,您正在创建名称为str
对象,其类型为QString
,初始值为"my string"
。
在第二个声明中,您创建了名称为str
的类型为QString
的指针。
指针不保留该值,它们指向存储值的存储位置,差异很大。
链接地址: http://www.djcxy.com/p/13805.html上一篇: Which is the right way to instantiate objects in C++?
下一篇: Memory allocation areas in C++ (Stack vs heap vs Static)