C++ 显式构造函数调用
我想知道是否有某种技巧可以使用对象指针显式调用构造函数。如果这是一个合法的语法,它将如下所示:C++ 显式构造函数调用,c++,C++,我想知道是否有某种技巧可以使用对象指针显式调用构造函数。如果这是一个合法的语法,它将如下所示: Foo *p = malloc( sizeof(Foo) ); p->Foo::Foo(); 另外,我知道我可以做Foo*p=newfoo()但是显式使用malloc()有一个重要的原因。您可以使用“placement new”操作符: Foo *buf = malloc( sizeof(Foo) ); Foo *p = new (buf) Foo(); 使用新的位置: Foo* p =
Foo *p = malloc( sizeof(Foo) );
p->Foo::Foo();
另外,我知道我可以做Foo*p=newfoo()代码>但是显式使用malloc()有一个重要的原因。您可以使用“placement new”操作符:
Foo *buf = malloc( sizeof(Foo) );
Foo *p = new (buf) Foo();
使用新的位置:
Foo* p = new(malloc(sizeof(Foo))) Foo;
(在此处进行内存不足检查)
基本上,new(address)Foo()
在address
指向的位置构造一个类型为Foo
的对象,换句话说:它调用构造函数。您可以使用新的位置在某个地址构造新对象
void *buf = malloc(sizeof(Foo));
Foo *p = new (buf) Foo();
您可以在上阅读更多内容。其他人已经指出,您可以使用“新位置”。如果您希望类的某些特定对象位于使用malloc
分配的内存中,那么这种方法非常有效。正如已经指出的,当您这样做时,您需要显式地调用dtor
如果希望一个类的所有对象都在使用malloc
分配的内存中,可以为该类重载operator new
(和operator delete
),并让它们调用malloc
,以获取原始内存。这免除了客户机代码单独分配/初始化的额外步骤
如果希望一个集合(或多个集合)中的所有对象都在使用malloc
分配的内存中,可以向集合提供分配器以实现这一点。同样,这减轻了处理分配的客户机代码,并使容器的外观、行为和“感觉”与普通容器相似。struct MyClass
struct MyClass
{
MyClass()
{
std::cout << "ctor" << std::endl;
}
~MyClass()
{
std::cout << "dtor" << std::endl;
}
};
int main(int argc, char *argv[])
{
// Allocate memory and call constructor
MyClass myObj;
// Call constructor again with placement new
new (&myObj) MyClass;
}
{
MyClass()
{
std::不要忘记,如果您手动构造它,您也应该手动销毁它。还应该注意,在这种情况下,您还负责显式调用析构函数:p->~Foo();
(delete p
将不起作用)@John:我想知道你说的这个原因:),new
可能在引擎盖下使用了malloc
,那何必麻烦呢?谢谢大家,这很有帮助!