c ++中的malloc和构造函数

Com*_*guy 1 c++ malloc constructor new-operator

是否可以使用malloc?将一些参数传递给另一个类的构造函数中的类的构造函数?我可以这样做new.我需要做同样的事情malloc:(如果它没有意义,考虑我使用自定义分配器而不是malloc)

Class A_Class ... {
       public:
       B_Class *b;
...
     A_Class: ...
      { b = new B_Class (c1, c2, c3);
      } // end of constructor
}
Run Code Online (Sandbox Code Playgroud)

现在使用malloc:

Class A_Class ... {
       public:
       B_Class *b;
...
     A_Class: ...
      { b = (B_Class*) malloc (sizeof(*b)); 
        ??????????????? }
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 9

malloc分配原始内存.尝试将构造函数参数传递给它是没有意义的,因为它不会调用任何构造函数.

如果必须使用原始内存,则可以使用" placement new "语法在先前分配的原始内存中构造对象

...
void *raw_b = malloc(sizeof *b);
b = new(raw_b) B_Class(c1, c2, c3); // <- placement new 
...
Run Code Online (Sandbox Code Playgroud)

在数字上,值b将是相同的raw_b,即可以在没有额外raw_b指针的情况下获得.但我喜欢这样做,用中间void *指针,以避免丑陋的演员阵容.

当然,在销毁这些物品时要小心.自定义分配需要自定义删除 你不能只是deleteb的一般情况.对称的自定义删除序列将涉及显式析构函数调用,然后是原始内存释放

b->~B_Class(); // <- explicit destructor call
free(b);
Run Code Online (Sandbox Code Playgroud)

PS您可能会考虑使用不同的路径:在您的类中重载operator new/ operator delete而不是在每次需要创建对象时明确拼写自定义分配.