如何解决显式构造函数调用
| 我想知道是否有某种技巧可以使用对象指针显式调用构造函数。如果这是合法的语法,则它将如下所示:Foo *p = malloc( sizeof(Foo) );
p->Foo::Foo();
附言我确实知道我可以做Foo *p = new Foo();
,但是显式使用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
类型的对象,换句话说:它调用构造函数。
,您可以使用new放置在某个地址构造新对象。
void *buf = malloc(sizeof(Foo));
Foo *p = new (buf) Foo();
您可以在Wikipedia的文章中了解更多信息
,其他人已经指出,您可以使用新的展示位置。如果您希望将某些特定类的对象存储在分配有malloc
的内存中,则此方法很好用。正如已经指出的那样,执行此操作时,需要显式调用dtor。
如果要让某个类的所有对象都在分配有malloc
的内存中,则可以对该类重载operator new
(和operator delete
),并让它们调用malloc
以获取原始内存。这使客户代码免除了单独分配/初始化的额外步骤。
如果希望将集合中的所有对象(或多个集合)存储在用with8分配的内存中,则可以为该集合提供分配器以实现此目的。再次,这减轻了处理分配的客户代码,并使容器看起来,动作和“感觉”像普通容器一样。
, 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。