当我们使用new创建一个对象时, 它会在堆上分配.但是,我们正在实例化的类成员会发生什么?例如,
class foo {
Bar x;
Bar *y;
foo() {
x = 10;
y = new Bar();
}
}
Run Code Online (Sandbox Code Playgroud)
这里,x是一个对象,而y是Bar的一个实例.它们都分配在堆上吗?所以如果foo的对象˚F是一个方法内本地创建的,会发生什么Ÿ当f超出范围是什么?
另外,如果在堆上创建F,我们何时会得出结论F是悬空(没有人指向它)?因为,有可能是F无引用,但有可能会引用ÿ.
它们与父对象一起运行,即,它们是动态分配的,或者具有自动存储持续时间,具体取决于父进程的初始化方式.这并不一定意味着您需要单独解除分配.
x在您的情况下,父对象将自动解除分配.但是,y动态分配.因此,它需要单独的释放.任何呼叫都new必须在某个时刻跟随呼叫delete.这个基本规则将帮助您解释这些情况.
另外,应该使用称为RAII(资源分配是初始化)的模式来管理动态分配对象的重新分配(不要忘记"三规则"!).您还应该习惯使用初始化列表而不是使用构造函数的主体来初始化对象,即,
class foo {
Bar x;
Bar *y;
foo() : x(10), y(new Bar()) { }
// who deallocates y here? Again, look into RAII
}
Run Code Online (Sandbox Code Playgroud)