【发布时间】:2014-11-01 07:47:29
【问题描述】:
我有两种使用 new 运算符分配内存的情况。
class xx{
public: int x;
xx(){}
~xx(){}
};
class yy : public xx {
public: int y;
yy(){}
~yy(){}
};
int main(int argc, char *argv[])
{
yy *y1 = new yy(); //y1 constructor is called
//CASE-1
yy *y2 = y1;
//CASE-2
yy *y3 = new (y1) yy();
return 0;
}
在 CASE-1 中,我只是将 y1 内存分配给 y2,而不破坏 y1(浅拷贝)。这里不会调用构造函数。
在 CASE-2 中,我将 y1 内存分配给 y3 到破坏 y1 的地址。这里将调用 y3 的构造函数。但是没有调用 y1 的析构函数。据我了解,在以后的代码中使用 y1 和 y2 时,应用程序必须对空值检查采取预防措施。
所以基本上我想了解与 CASE-1 相比,CASE-2 有用的场景。提前致谢。
【问题讨论】:
-
我不得不承认我不知道 case 2 的语法。我不知道你可以像这样创建一个新的 yy 实例!有人可以确认这是否编译吗?
-
它编译老兄..你可以编译它。
-
您需要在放置新位置之前显式调用 dtor。重用内存时不会自动调用析构函数
-
您只在调用
new yy()时分配了内存。之后您没有分配更多内存。放置 new 用于构造对象是内存中的特定位置(必须在之前分配)。它可以被视为一种显式调用构造函数的方式。它不调用任何析构函数。
标签: c++ new-operator