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