Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++;堆栈和堆上的对象生存期_C++_Delphi_Object Lifetime - Fatal编程技术网

C++ C++;堆栈和堆上的对象生存期

C++ C++;堆栈和堆上的对象生存期,c++,delphi,object-lifetime,C++,Delphi,Object Lifetime,我试图翻译一些我用Delphi做的项目;对象通常可以声明为: //I have the control of the object and I MUST delete it when it's not needed anymore male := THuman.Create(); try // code finally male.Free; (get rid of the object) end; 阅读Stroustrup关于C++的书,我明白了,他的语言不需要最后< /Cord>块,因

我试图翻译一些我用Delphi做的项目;对象通常可以声明为:

//I have the control of the object and I MUST delete it when it's not needed anymore

male := THuman.Create();
try
 // code
finally
 male.Free; (get rid of the object)
end;
阅读Stroustrup关于C++的书,我明白了,他的语言不需要<代码>最后< /Cord>块,因为总是有解决办法。现在,如果我想创建一个类,我有两种方法:

  • THuman男性在其中创建对象,然后在块
    {…code…}
    结束时超出范围

  • THuman*male=new THuman
    我可以通过
    delete


  • 这本书建议使用第一种方法(即使两者都很好),但我来自Delphi背景,我想使用第二种方法(我可以控制对象)

    <>强>问题> <强> >我无法理解C++对对象和在线阅读的2种方法的区别,我得到了更多的困惑。如果我说方法1在堆栈上分配内存,方法2在堆上分配内存,对吗

    在方法2中(我们在堆中),如果我给对象赋值
    NULL
    ,我还需要调用delete吗

    例如,Delphi只允许在堆上创建实例,
    Free
    删除对象(如C++中的
    delete

    如果我说方法1在堆栈上分配内存,方法2在堆上分配内存,对吗

    在方法2中(我们在堆中),如果我给对象赋值为NULL,我还需要调用delete吗

    • 考虑使用而不是原始指针。智能指针是处理指针资源并使其使用更安全的对象。 但是,如果无法使用智能指针,请确保在将
      NULL
      分配给指针之前,先在指针上调用
      delete
      ,以释放堆中以前分配的内存。否则,您将泄漏资源。要检查程序内存管理,可以运行
    在方法2中(我们在堆中),如果我给对象赋值为NULL,我还需要调用delete吗

    如果在调用delete之前执行此操作,则内存泄漏;如果在空指针上调用delete,则会出现seg故障(应用程序崩溃)

    最好的方法是使用堆栈对象,但如果需要管理对象的存在性,请按照上面的建议使用智能指针(unique_ptr、shared_ptr)

    注:我所说的“泄漏内存”是指该区域丢失,无法从程序中访问,也无法由操作系统释放。

    简而言之

    1-未使用
    new
    创建的对象具有自动生存期(如您所说,在堆栈中创建,但这是大多数编译器选择的实现技术),一旦它们超出范围,就会自动释放

    2-使用
    new
    (在堆中创建,也是大多数编译器的一种实现技术)创建的对象的生存期需要由程序员管理。请注意,删除并不是将指针设置为NULL,它应该在之前发生。简单的规则是:

    • 每个
      必须与一个匹配,并且只能与一个
      删除
    • 每个
      new[]
      (创建动态数组)必须与一个匹配,并且只有一个
      delete[]

    p、 s:matched here涉及程序运行时的一对一事件,而不一定是代码本身(您可以控制何时何地删除任何新对象)。

    尽可能避免使用指针和动态分配。如果你不能很好地理解它们,它们只会导致问题和奇怪的行为。自动存储(堆栈上的局部变量)是安全的,只要您只需要当前(或嵌套)块中的变量,就可以正常工作。在现代C++中,除了多态性外,很少需要指针,不需要手动控制生命周期。这对于异常来说并不可靠。C++没有最终的。你不需要用C++语法编写德尔福代码。将程序转换成语言。@Someprogrammerdude没有指针就不能编写任何非平凡的程序!当您说“是”时,对于方法1,您应该清楚,一些存储将被分配到堆栈上,然后对象的构造函数可以在堆上分配更多的内容。C++的规范并没有具体地说,局部变量存储在“堆栈”上。它是处理局部变量的最常用方法,但是C++规范只说它们具有“自动”存储。编译器可能会选择不同地存储局部变量。因此,在C++中,一般来说最好避免指针?因为指针更“C风格”@RaffaeleRossi这是基于观点的,有些人会告诉你是这样的,其他人(像我一样)会告诉你可以随意使用指针,因为它们是一种非常强大的习惯用法。其他人会提倡使用智能指针,但IMO的关注点不同。所以我可以说,这就像拥有一辆山地自行车或城市自行车?两者的作用相同,但人们更喜欢其中一种,这也取决于他们的用途need@RaffaeleRossi事实上,这不是偏好的问题。如果仅“本地”需要该对象,请不要
    新建它
    。如果它是在某个函数上创建的,需要被传递到另一个函数,那么它需要在它的创建范围内生存,你可以重新创建它并返回一个指针。“那么C++中一般都避免指针的存在”?没有方法不用指针就可以编写非平凡C++。