Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显式构造函数调用_C++ - Fatal编程技术网

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
,那何必麻烦呢?谢谢大家,这很有帮助!