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

标签 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 get 在堆栈上分配了两次!啊。

然后我发现在A的构造函数中我可以做的是:

A::A() : b(B::B(7)) {

}

并且 b 只在堆栈上分配一次!

但这很笨重。有人有更好的主意吗?请记住,构造函数只能调用一次!

这是使用重要参数非动态分配对象的标准方法吗?如果我们可以将 b 的构造推到那个奇特的参数列表中会怎样!?您被迫在堆栈上动态分配或构造 TWICE!

奖励问题:b 什么时候被释放?是在A的析构函数之后还是之前

最佳答案

很抱歉,你完全错了。

你需要做的是拿起一个good beginner's C++ book .这是该语言的基础部分,如果您不理解这一点,您将在处理重要的 C++ 代码时遇到困难。

也就是说,当一个对象即将被创建时,所有的子对象都会先被创建。如果您需要将参数传递给那些子对象构造函数,则需要创建所谓的初始化列表:

A::A(int i) : b(i) {}

冒号之后和第一个大括号之前的内容是初始化列表。只有构造函数可以拥有它们。这里发生的事情是我们将 i 的值传递给 b 子对象的构造函数。这发生在 A 的构造函数被调用之前!

所以对于你的情况,构造顺序是:

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

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

关于c++ - 在堆栈上创建 C++ 对象,努力不分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3911491/

相关文章:

c++ - 在已发布的结构中添加构造函数(在 memcpy 中使用)是否安全?

c - 我如何从内存和其中的数组中释放一个结构

c# - .net 内存使用情况,决定私有(private)字节大小的因素

ios - 从未发布的表格 View 图像

c++ - 编译时拓扑排序超出 C++ 中的递归深度

C++:转换/转换 void 指针到结构引用

c++ - 存储在 char 数组中的 double 数据返回一个 float 值

c - 指针指向 Void 的内存分配

c++ - 动态分配对象内部的动态分配

c++ - 每个带有 cmake 的 objective-c uda 编译器选项