Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++_Constructor_Destructor_Initializer_Placement New - Fatal编程技术网

C++ 当显式调用构造函数时,是否构造了初始值设定项和成员变量?

C++ 当显式调用构造函数时,是否构造了初始值设定项和成员变量?,c++,constructor,destructor,initializer,placement-new,C++,Constructor,Destructor,Initializer,Placement New,在使用“placement new”时,建议显式调用构造函数和析构函数 在这种情况下,在类的初始值设定项部分初始化的对象是否也能正确构造 显式调用析构函数也一样吗?成员对象是否正确销毁 在使用“placement new”时 建议调用构造函数和 显式析构函数 说“显式调用构造函数”是不正确的,因为构造函数没有名称($12.1/1) 在这种情况下,对象 在初始化器部分初始化 一个班级的学生也能得到适当的教育 建造 对。你为什么怀疑它?placement new仅意味着new操作符不会分配任何内存,

在使用“placement new”时,建议显式调用构造函数和析构函数

在这种情况下,在类的初始值设定项部分初始化的对象是否也能正确构造

显式调用析构函数也一样吗?成员对象是否正确销毁

在使用“placement new”时 建议调用构造函数和 显式析构函数

说“显式调用构造函数”是不正确的,因为构造函数没有名称($12.1/1)

在这种情况下,对象 在初始化器部分初始化 一个班级的学生也能得到适当的教育 建造

对。你为什么怀疑它?placement new仅意味着
new
操作符不会分配任何内存,而是使用placement new中传递的内存来构造对象。对象在您传递的内存中构造

显式调用 析构函数?成员对象得到了什么 正确销毁

在使用“placement new”时 建议调用构造函数和 显式析构函数

说“显式调用构造函数”是不正确的,因为构造函数没有名称($12.1/1)

在这种情况下,对象 在初始化器部分初始化 一个班级的学生也能得到适当的教育 建造

对。你为什么怀疑它?placement new仅意味着
new
操作符不会分配任何内存,而是使用placement new中传递的内存来构造对象。对象在您传递的内存中构造

显式调用 析构函数?成员对象得到了什么 正确销毁

在使用“placement new”时,建议显式调用构造函数和析构函数

我不这么认为。它会说您需要显式调用析构函数

在这种情况下,在类的初始值设定项部分初始化的对象是否也能正确构造

除了提供内存外,新位置的所有其他方面与普通新位置相同。因此,它只使用提供的指针,而不是动态分配内存

显式调用析构函数也一样吗

您可以(如果感觉为空)显式地对任何对象调用析构函数。它将正常调用用户定义(或编译器生成)类析构函数。需要对通过placement new创建的对象显式执行此操作的原因是,可以对这些对象调用delete。这是因为delete假设对象是在动态分配的内存中创建的,并在调用析构函数后尝试重新循环该内存

成员对象是否正确销毁

如果我们这样看待新事物:

// not real code
template<class T> T* new(void* location = NULL)  (ArgumentsForT)
{
    // If you do not provide location (normal usage)
    // then we allocate some memory for you.
    if (location == NULL)
    {    location = malloc(sizeof(T));   // Use of malloc() is just an example
    }

    ((T*)location)->Constructor(ArgumentsForT);
    return (T*)location;
}
在使用“placement new”时,建议显式调用构造函数和析构函数

我不这么认为。它会说您需要显式调用析构函数

在这种情况下,在类的初始值设定项部分初始化的对象是否也能正确构造

除了提供内存外,新位置的所有其他方面与普通新位置相同。因此,它只使用提供的指针,而不是动态分配内存

显式调用析构函数也一样吗

您可以(如果感觉为空)显式地对任何对象调用析构函数。它将正常调用用户定义(或编译器生成)类析构函数。需要对通过placement new创建的对象显式执行此操作的原因是,可以对这些对象调用delete。这是因为delete假设对象是在动态分配的内存中创建的,并在调用析构函数后尝试重新循环该内存

成员对象是否正确销毁

如果我们这样看待新事物:

// not real code
template<class T> T* new(void* location = NULL)  (ArgumentsForT)
{
    // If you do not provide location (normal usage)
    // then we allocate some memory for you.
    if (location == NULL)
    {    location = malloc(sizeof(T));   // Use of malloc() is just an example
    }

    ((T*)location)->Constructor(ArgumentsForT);
    return (T*)location;
}

`建议显式调用构造函数和析构函数`。如何显式调用构造函数?@Mahesh,
void*const pmem=malloc(sizeof(test));test*const t=新的((void*)pmem)测试()和对于dtor:
t->~test()
@MJ-AFAIK您可以调用析构函数,但是
explicit
不应用于构造函数。尽管在初始值设定项列表中,您似乎是从其派生类调用基类构造函数。如果使用了关键字
explicit
,那么如果
foo
是类名,我应该能够执行
obj->foo()。但这是不允许的。我说的对吗?@Moo Juice:如果这是显式的定义,那么构造函数总是显式调用的。通常,我们认为构造函数在对象构造期间被隐式调用(因为构造函数没有实际名称)。可以显式调用析构函数。创建对象数组时不显式调用构造函数。`建议显式调用构造函数和析构函数'。如何显式调用构造函数?@Mahesh,
void*const pmem=malloc(sizeof(test));test*const t=新的((void*)pmem)测试()和对于dtor:
t->~test()
@MJ-AFAIK您可以调用析构函数,但是
explicit
不应用于构造函数。尽管在初始值设定项列表中,您似乎是从其派生类调用基类构造函数。如果使用了关键字
explicit
,那么如果
foo
是类名,我应该能够执行
obj->foo()。但这是不允许的。我说的对吗?@Moo Juice:如果这是显式的定义,那么构造函数总是显式调用的。通常,我们认为构造函数在对象构造期间被隐式调用(因为构造函数没有
char   x[sizeof(T)];  // don't do this (memory may not be aligned correctly).
T*  obj = new (x) T();

delete obj;  // FAIL. The memory was not dynamically allocated.
             //       Delete will try and re-claim this memory for re-yse
             //       Even if the memory is local.

 // This is why on placement new you need to call the destructor
 obj->~T();