C++ C++;堆栈和堆上的对象生存期
我试图翻译一些我用Delphi做的项目;对象通常可以声明为: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>块,因
//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在堆上分配内存,对吗
- 对
- 考虑使用而不是原始指针。智能指针是处理指针资源并使其使用更安全的对象。
但是,如果无法使用智能指针,请确保在将
分配给指针之前,先在指针上调用NULL
,以释放堆中以前分配的内存。否则,您将泄漏资源。要检查程序内存管理,可以运行delete
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++。