在C++;? 在C++中(我使用Qt),我可以创建QStand类的两种方式: 方法1 方法2
我知道这和指针有关。因此,我的问题是:在C++;? 在C++中(我使用Qt),我可以创建QStand类的两种方式: 方法1 方法2,c++,qt,visual-c++,qt4,C++,Qt,Visual C++,Qt4,我知道这和指针有关。因此,我的问题是: 这两者的区别是什么 我应该坚持哪种方法 什么时候使用方法1正确,什么时候使用方法2正确 在方法2中,我可以通过调用delete str销毁对象。使用方法1时,如何删除str变量 谢谢当您使用第一种语法时,您正在创建名为str的对象,其类型为QString,初始值为“我的字符串” 在第二个声明中,创建类型为QString的指针,其名称为str 指针不保存值,它们指向存储值的内存位置,差异很大。方法一将使用自动内存管理(对象超出范围时将被删除) 方法二是用于手
delete str销毁对象代码>。使用方法1时,如何删除str
变量
谢谢当您使用第一种语法时,您正在创建名为
str
的对象,其类型为QString
,初始值为“我的字符串”
在第二个声明中,创建类型为QString
的指针,其名称为str
指针不保存值,它们指向存储值的内存位置,差异很大。方法一将使用自动内存管理(对象超出范围时将被删除) 方法二是用于手动内存管理——在调用
delete str之前不会删除它代码>
如果您忘记删除它--这会造成我们称之为内存泄漏的情况
通常情况下,方法一是最佳选择,除非您有理由使用指针。(出错的可能性较小)
您可能会发现以下内容很有帮助:
不同之处在于方法一在堆栈上创建QString
,第二种方法在免费存储上创建QString
。(请注意,QString s=“hello”
与QString s(“hello”);
完全相同)正如parapura rajkumar所说,当你能做1时,总是做1,当你不能做1时,总是做2
方法1有很多优点,不仅仅是自动内存管理。当QString
超出作用域时,它所占用的内存将自动释放,因此不需要做任何事情来释放它的内存。方法2要求您在处理完后使用delete
,以释放内存,否则将导致内存泄漏
另一个优点是,在堆栈上创建内容比在免费存储上创建要快得多
您必须使用方法2的一种情况是,您需要该对象的持续时间超过您所处的范围。然后,您将使用new
在免费商店中进行分配,这样它将一直持续到您对其调用delete
,然后将指针传递给其他人
基本上,它们有不同的生命周期:在方法2中创建的对象在您调用delete之前将有任意长的生命周期;在方法1中,它将在堆栈上创建,并在函数调用返回时销毁(如果有)。第二,方法2需要更多的工作,因为非平凡的内存管理
使用与所需生存期匹配的方法。如果方法1的生存期对您来说足够好,那么不要使用方法2,因为它会带来内存管理的开销。如果你可以重新构造你的程序,这样你可以在改进设计的同时使用方法1,那将会更加高效和优雅
见第2条。在上面特别是,使用方法1并存储指向对象的指针并在其生命周期后访问它是一个陷阱。方法2也可以做到这一点,但显式销毁将程序员的注意力集中在它身上(但仍然因为生命周期并不简单,这很可能是一个陷阱)。方法2的一个陷阱是忘记删除它,导致内存泄漏(或过早删除它,并按照本段前面所述引用它)
在方法1中,当函数返回时,对象将自动删除
这两件事截然不同
QString str(“我的字符串”)代码>创建一个自动管理其生存期的对象:该对象要么生存到其封闭范围的末尾(如果是局部变量),要么生存到程序的末尾(如果是全局变量)
newqString(“我的字符串”)代码>创建具有手动管理生存期的对象,也称为“动态对象”(并返回指向此对象的指针)。这意味着您负责管理对象的生存期。这几乎从来都不是正确的做法,除非您正在编写库组件
这是C++哲学的核心:C++是图书馆写作的一种语言。您拥有编写高质量、可重用组件的工具。如果你这样做,你将需要了解生命周期管理的复杂性。但是,在此之前,您应该使用现有的库组件。这样做时,您会发现几乎不需要执行任何手动管理
使用动态容器(向量、字符串、映射等)存储数据并构建自己的数据结构。如果需要修改调用方作用域中的对象,请通过引用传递参数。从更简单的组件构建复杂的类。如果您确实必须拥有动态对象,请通过unique\u ptr
或shared\u ptr
处理程序类来处理它们
不要使用指针。很少使用new
,也从不使用delete
(进一步提示:1)除非是用于ADL,否则不要使用使用命名空间。2) 除非您正在编写库组件,否则设计良好的类不应具有析构函数、复制构造函数或赋值运算符。如果他们这样做了,将有问题的逻辑分解成单个责任库组件,然后参见2)。什么时候使用方法1正确,什么时候使用方法2正确
在本例中,何时可以使用指针并不明显。但是,如果您创建自己的类,例如Images,它包含大量数据,并且您希望在函数或方法中使用该类的pass对象,那么我建议您使用指向对象的指针,而不是对象本身。为什么?如果你
QString str = "my string";
QString *str = new QString("my string");