好奇为什么会失败.在返回对象而不是指针本身使用new的情况下,为什么在之后制作指针然后删除指针是非法的.我是否误解了这个序列的某些内容?
例如
Example e = *new Example(); //dereferencing the pointer to get Example object
Example* g = &e; //pointer pointing to e's address
delete g; //g is still pointer, but errors here.
Run Code Online (Sandbox Code Playgroud)
C++指针与Java引用完全不同.让我们分解吧.
Example e = *new Example();
Run Code Online (Sandbox Code Playgroud)
这一行正在构建一个Example具有动态存储持续时间的对象,这是一种奇特的方式,它说它在内存TM中创建一个对象.然后,您将该对象存储在TM的某个位置,并将其复制到具有自动存储持续时间的值中.现在你有一个TM的某个对象和一个存储在调用堆栈1上的独立的相同对象.前者被分配,而后者则没有.new
Example* g = &e;
Run Code Online (Sandbox Code Playgroud)
现在你正在接受并宣布g为地址e.但是e是在栈上,所以g点到Example这是不使用分配new.
delete g;
Run Code Online (Sandbox Code Playgroud)
然后尝试删除g,指向具有自动存储持续时间的对象.因此,未定义的行为.
正如评论中提到的@ Rakete1111,您可能正在寻找的行为是使用C++引用类型.
Example& e = *new Example();
Example* g = &e;
delete g;
Run Code Online (Sandbox Code Playgroud)
这将声明e为一个引用对象,因此它Example在查看动态存储时指向原始对象,否则就像C++标量一样.然后你可以安全地获取它的地址并删除它,获得所需的行为.然而,这是非常单一的,不应该在实际代码中使用.
1严格地说,C++标准中没有任何内容表明具有自动存储持续时间的对象必须在调用堆栈上,但是出于教学目的这样考虑它可能会有所帮助.