在使用“放置新建”时,建议明确调用构造函数和析构函数。当一个构造函数被显式调用时,是否构造了构造函数和成员变量?
在这种情况下,在类的初始化部分中初始化的对象是否也会得到正确构造?
显式调用析构函数也一样吗?成员对象是否被正确销毁?
在使用“放置新建”时,建议明确调用构造函数和析构函数。当一个构造函数被显式调用时,是否构造了构造函数和成员变量?
在这种情况下,在类的初始化部分中初始化的对象是否也会得到正确构造?
显式调用析构函数也一样吗?成员对象是否被正确销毁?
在使用“placement new”时,建议明确调用构造函数和析构函数。
我不这么认为。它会说你需要明确调用析构函数。
在这种情况下,在类的初始化器部分初始化的对象是否也能正确构造?
除了提供内存之外,所有其他放置方面的新内容都与普通新内容相同。所以不是动态分配内存,而是使用提供的指针。
与显式调用析构函数相同吗?
你可以(如果你觉得没有)在任何对象上显式调用析构函数。它将像平常一样调用用户定义的(或编译器生成的)类析构函数。您需要明确地为通过展示位置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;
}
所以放置新的工作只是像普通新。
望着调用这里删除
template<typename T> void delete(T* obj)
{
if (obj != NULL)
{
obj->~T();
free(obj);
}
}
麻烦的是,删除不能告诉我们,如果内存是由new分配或如果内存是由用户分配并传递到新的(安置新)。所以它总是在内存中调用free。如果您使用placement new,那么您可能没有动态分配内存(或者内存仍然用于其他内容)。
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();
在使用“放置新的”它是 建议调用构造函数和析构函数 明确。
这不是正确的说,“你所拨打的构造明确”,为构造函数没有名称($ 12.1/1)。
在这种情况下将物体 一类的初始化部分 初始化也得到妥善 构建?
是的。你为什么怀疑它? Pla新仅意味着new
运算符将不会分配任何内存,而是将使用您在新放置中通过的内存来构造对象。该对象在您传递的内存中构建。
与明确调用 析构函数相同吗?成员对象是否正确销毁 ?
是的。
`建议明确调用构造函数和析构函数`。如何显式调用构造函数? – Mahesh 2011-01-07 14:58:06
@Mahesh,`void * const pmem = malloc(sizeof(test)); test * const t = new((void *)pmem)test();`和dtor:`t->〜test();`。 – 2011-01-07 15:17:09