2011-01-07 116 views
0

在使用“放置新建”时,建议明确调用构造函数和析构函数。当一个构造函数被显式调用时,是否构造了构造函数和成员变量?

在这种情况下,在类的初始化部分中初始化的对象是否也会得到正确构造?

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

+0

`建议明确调用构造函数和析构函数`。如何显式调用构造函数? – Mahesh 2011-01-07 14:58:06

+0

@Mahesh,`void * const pmem = malloc(sizeof(test)); test * const t = new((void *)pmem)test();`和dtor:`t->〜test();`。 – 2011-01-07 15:17:09

回答

1

在使用“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(); 
2

在使用“放置新的”它是 建议调用构造函数和析构函数 明确。

这不是正确的说,“你所拨打的构造明确”,为构造函数没有名称($ 12.1/1)。

在这种情况下将物体 一类的初始化部分 初始化也得到妥善 构建?

是的。你为什么怀疑它? Pla新仅意味着new运算符将不会分配任何内存,而是将使用您在新放置中通过的内存来构造对象。该对象在您传递的内存中构建。

与明确调用 析构函数相同吗?成员对象是否正确销毁 ?

是的。

相关问题