C++ 中的 malloc 和构造函数



是否可以使用 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)); 
        ??????????????? }
}
malloc分配

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

如果必须使用原始内存,则由您使用"放置新"语法在以前分配的原始内存中构造对象

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

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

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

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

附言您可以考虑采用不同的路线:在类中重载operator new/operator delete,而不是在每次需要创建对象时都显式拼写出自定义分配。

不,这是不可能的。如果它是为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缓冲区。

malloc

调用构造函数。 无法将参数传递给未被调用的函数。 至于自定义分配器,您必须更具体地说明自己在做什么。 谁在使用自定义分配器的位置分配什么。 通常,自定义分配器仅用于分配;它们也不关心构造函数。

您可以创建用于构造 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;
     }
 ....

相关内容

  • 没有找到相关文章

最新更新