gpt4 book ai didi

C++ 对象在堆栈和堆上的生命周期

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:22 27 4
gpt4 key购买 nike

我正在尝试翻译我用 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++ 的书,我了解到(简而言之)他的语言不需要 finally block ,因为总有解决方法。现在,如果我想创建一个类,我有两种方法:

  1. THuman male; 在其中创建对象,然后在 block {... code ...} 结束时超出范围

  2. THuman* male = new THuman 我可以控制对象的生命并用 delete

  3. 销毁它

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

问题。我无法理解 C++ 对象的两种方法之间的区别,在线阅读时我更加困惑。如果我说方法 1 在堆栈上分配内存,方法 2 在堆上分配内存是否正确?

在方法 2 中(我们在堆中)如果我将值 NULL 分配给对象,我是否仍然需要调用 delete?

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

最佳答案

简而言之

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

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

  • 每个 new 必须与一个唯一的 delete
  • 匹配
  • 每个 new[](动态数组的创建)必须与一个唯一的 delete[]
  • 匹配

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

关于C++ 对象在堆栈和堆上的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316414/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com