Gue*_*sto 2 c++ memory-management
假设我有一堂课
class A {
public:
A(int i);
~A();
private:
B b; // Want <- this guy to be constructed with i in A's constructor!
};
我希望b在构造函数中构造,具有在构造A之前不知道的特定参数.如果我要在A的构造函数中执行以下操作:
A::A(int i) {
B b(i);
// Or even if I try to do b = B::B(i);
}
我注意到b在堆栈上被分配了两次!aghghg.
然后我发现我在A的构造函数中可以做的是:
A::A() : b(B::B(7)) {
}
并且b只在堆栈上分配一次!
但这非常笨重.谁有更好的主意?请记住,构造函数应该只调用一次!
这是使用重要参数非动态分配对象的标准方法吗?如果我们能把b的结构推到那个花哨的参数列表中,那该怎么办?你被迫在堆栈上动态分配或构建TWICE!
奖金问题:什么时候被解除分配?是在A的析构函数之后或之前
我很遗憾地说,但你错了.
你需要做的是找一本优秀的初学者的C++书.这是语言的一个基本部分,如果你不理解这一点,你将在处理非平凡的C++代码时遇到困难.
话虽这么说,当即将创建一个对象时,将首先创建所有子对象.如果需要将参数传递给这些子对象构造函数,则需要创建所谓的初始化列表:
A::A(int i) : b(i) {}
Run Code Online (Sandbox Code Playgroud)
冒号后面和第一个括号之前的东西是初始化列表.只有构造函数才能拥有它们.这里发生的是我们将值传递i给b子对象的构造函数.这发生在A调用构造函数之前!
因此,对于您的情况,构造顺序是:
b子对象A对象本身破坏的顺序是完全相反的过程.