内存在C ++中重用?在构造函数内部使用带有此指针的new放置

问题描述

我在测试中问了以下q之一(输出)。我进行了很多搜索,但无法理解原因

#include <iostream>
using namespace std;
class building{
  public:
    building()  {
    cout<<"geek building"<<endl;
  }
};
   

class house: public building{
  public: 
  house(){
    cout<<"geek house"<<endl;
  }
  house(string name){
    new (this) house();
    cout<<"geek house: string constructor"<<endl;
  }  
};

int main() 
{
  house h("geek");
  return 0;
}

我在以下方面遇到问题

new (this) house;

从n3337,第3.8章(对象生存期)开始:

程序可以通过重用对象占用的存储空间或通过为具有非平凡析构函数的类类型的对象显式调用析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,在重用或释放该对象占用的存储空间之前,不需要程序显式调用析构函数。但是,如果没有对析构函数的显式调用,或者未使用delete-expression(5.3.5)释放存储,则不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序行为不确定。

我的代码给出以下输出

geek building
geek building
geek house
geek house: string constructor

我有以下两个问题:

1)使用该指针在活动对象的构造函数内部放置new是否合法。我知道,如果我们使用另一个(大小相同)指针代替该指针并放置新位置,将不会有问题。示例

new (p2) house;  //p2 is a pointer to class house (house  *p2)

1)根据上述文档,我的代码不应给出错误,因为我在新建这座房子之后再次重用了旧对象; 但是通过重新使用内存,旧对象的生命周期已经结束

有人可以解释为什么没有给出错误吗?并解释输出。 任何帮助表示赞赏。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)