C++ c+中的内存重用+;?在构造函数中使用此指针的placement new
我在测试中问了其中一个问题(输出)。我找了很多,但不明白为什么C++ c+中的内存重用+;?在构造函数中使用此指针的placement new,c++,inheritance,memory,multiple-inheritance,this-pointer,C++,Inheritance,Memory,Multiple Inheritance,This Pointer,我在测试中问了其中一个问题(输出)。我找了很多,但不明白为什么 #include <iostream> using namespace std; class building{ public: building() { cout<<"geek building"<<endl; } }; class house: public building{ public: house(){ cout
#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;
}
根据n3337第3.8章(对象寿命):
程序可以通过重用对象占用的存储,或者通过显式调用具有非平凡析构函数的类类型的对象的析构函数,来结束任何对象的生存期。对于具有非平凡析构函数的类类型的对象,在重用或释放该对象占用的存储之前,程序不需要显式调用析构函数;但是,如果没有显式调用析构函数,或者如果没有使用删除表达式(5.3.5)来释放存储,则不应隐式调用析构函数,并且依赖于析构函数产生的副作用的任何程序都具有未定义的行为
我的代码提供以下输出:
geek building
geek building
geek house
geek house: string constructor
我有以下两个问题:
1)在活动对象的构造函数中使用新的指针是否合法。我知道,如果我们使用另一个指针(大小相同),而不是放置新的指针,就不会有问题。示例
new (p2) house; //p2 is a pointer to class house (house *p2)
1)根据上述文档,我的代码不应该出现错误,因为我在新(这个)房子之后再次重用旧对象;
但是旧对象的生命周期已经通过重用内存而结束
有人能解释为什么它没有给出错误吗?并解释输出。
非常感谢您的帮助。您希望通过
新(这)房子
实现什么目标?“未定义的行为”意味着任何事情都可能发生:你的程序似乎在工作,或者发生了错误,或者你的整个计算机着火爆炸。如果您不想让您的计算机着火并爆炸,您应该尽一切努力避免未定义的行为。如果您想“调用”默认构造函数作为参数化构造函数的一部分,那么您应该使用构造函数初始值设定项列表,如house(字符串名称):house(){cout@SamVarshavchik,但是这一行新(这)房子不应该给出一个错误。因为你目前正在使用内存。@SamVarshavchik一台在UB上爆炸的计算机甚至无法启动。@Someprogrammerdude我的观点完全相同。我们可以像你说的那样调用它房子(字符串名称):房子(){COUNT您希望通过新(这)房子
实现什么?“未定义的行为”意味着任何事情都有可能发生:你的程序似乎在工作,或者发生错误,或者你的整个计算机着火爆炸。如果你不想让你的计算机着火爆炸,你应该尽一切努力避免未定义的行为。如果你想“呼叫”默认构造函数作为参数化构造函数的一部分,那么您应该使用构造函数初始值设定项列表,如house(字符串名称):house(){cout@SamVarshavchik,但此行不应该new(this)house
给出一个错误。因为你目前正在使用内存。@SamVarshavchik一台在UB上爆炸的计算机甚至无法在启动中生存。@Someprogrammerdude我的观点完全相同。我们可以像你说的那样调用它house(字符串名称):house(){cout
new (p2) house; //p2 is a pointer to class house (house *p2)