显式构造函数调用

问题描述

| 我想知道是否有某种技巧可以使用对象指针显式调用构造函数。如果这是合法的语法,则它将如下所示:
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;
    }
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...