2

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

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

现在使用 malloc:

Class A_Class ... {
       public:
       B_Class *b;
...
     A_Class: ...
      { b = (B_Class*) malloc (sizeof(*b)); 
        ??????????????? }
}
4

4 回答 4

13

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

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

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

在数值上, 的值b将与 相同raw_b,即无需额外的raw_b指针就可以通过。但我更喜欢这样做,使用中间void *指针,以避免丑陋的演员表。

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

b->~B_Class(); // <- explicit destructor call
free(b);

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

于 2012-07-03T15:00:31.280 回答
2

不,这是不可能的。如果它是为 C++ 设计的,那么您的自定义分配器将有一个construct用于此的调用函数(并rebind获得一个可以构造不同类型的分配器)。

在 C++03 中,这仅进行复制构造,因此您必须调用allocator.construct(ptr, B_Class(c1, c2, c3))并且该类必须是可复制的。在 C++11 中,分配器可以从任何参数构造。

如果您的分配器是为 C 设计的,那么您将不得不使用所谓的“新布局”。当然,malloc它是为 C 设计的。您应该自己查找它,但语法是:

b = (B_Class*) malloc(sizeof(*b));
new ((void*)b) B_Class(c1,c2,c3);

请记住处理构造函数可能抛出的任何异常以及free缓冲区。

于 2012-07-03T14:57:01.423 回答
0

malloc不调用构造函数。没有办法将参数传递给没有被调用的函数。至于自定义分配器,您必须更具体地了解您在做什么。谁在使用自定义分配器分配什么。通常,自定义分配器仅用于分配;他们也不关心构造函数。

于 2012-07-03T14:55:18.117 回答
0

您可以创建构造 B 的静态方法:

class B_Class
{
     public static B_Class* MallocMe(SomeParam param)
     {
           B_Class* retval = (B_Class*) malloc(sizeof(B_Class));
           retval->Construct(param);
           return retval;
     }
 ....
于 2012-07-03T15:01:15.577 回答