gpt4 book ai didi

c++ - c++ 中的 malloc 和构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:19:39 27 4
gpt4 key购买 nike

是否可以使用 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 分配原始内存。尝试将构造函数参数传递给它没有意义,因为它不调用任何构造函数。

如果您必须使用原始内存,您可以使用“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 * 指针,以避免丑陋的转换。

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

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

附言您可能会考虑走一条不同的路线:在您的类中重载 operator new/operator delete,而不是每次需要创建对象时都明确地拼出自定义分配。

关于c++ - c++ 中的 malloc 和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11313517/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com