在堆栈上创建c ++对象,努力不要分配

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的析构函数之后或之前

In *_*ico 7

我很遗憾地说,但你错了.

你需要做的是找一本优秀的初学者的C++书.这是语言的一个基本部分,如果你不理解这一点,你将在处理非平凡的C++代码时遇到困难.

话虽这么说,当即将创建一个对象时,将首先创建所有子对象.如果需要将参数传递给这些子对象构造函数,则需要创建所谓的初始化列表:

A::A(int i) : b(i) {}
Run Code Online (Sandbox Code Playgroud)

冒号后面和第一个括号之前的东西是初始化列表.只有构造函数才能拥有它们.这里发生的是我们将值传递ib子对象的构造函数.这发生A调用构造函数之前!

因此,对于您的情况,构造顺序是:

  1. b子对象
  2. A对象本身

破坏的顺序是完全相反的过程.