Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++;? 在C++中(我使用Qt),我可以创建QStand类的两种方式: 方法1 方法2_C++_Qt_Visual C++_Qt4 - Fatal编程技术网

在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 指针不保存值,它们指向存储值的内存位置,差异很大。方法一将使用自动内存管理(对象超出范围时将被删除) 方法二是用于手

我知道这和指针有关。因此,我的问题是:

  • 这两者的区别是什么
  • 我应该坚持哪种方法
  • 什么时候使用方法1正确,什么时候使用方法2正确
  • 在方法2中,我可以通过调用
    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");