是否可以使用 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;
}
....