很好奇为什么会失败。在返回对象而不是指针本身使用new的情况下,为什么在之后制作指针然后删除指针是非法的。我是否误解了这个序列的某些内容?
e.g。
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.
答案 0 :(得分:5)
C ++指针与Java引用完全不同。让我们分解吧。
Example e = *new Example();
这一行正在构建一个具有动态存储持续时间的Example
对象,这是一种奇特的方式,它说它在对象在某个地方 TM 。然后,您将该对象存储在某处 TM 中,并将其复制到具有自动存储持续时间的值中。现在你有一个某处 TM 的对象和一个存储在调用堆栈 1 上的单独的相同对象。前者分配了new
,而后者则没有。
Example* g = &e;
现在,您正在宣传g
作为e
的地址。但是e
位于堆栈中,因此g
指向使用Example
分配的new
。
delete g;
然后您尝试删除g
,它指向具有自动存储持续时间的对象。因此,未定义的行为。
正如评论中提到的@ Rakete1111,您可能正在寻找的行为是使用C ++引用类型。
Example& e = *new Example();
Example* g = &e;
delete g;
这会将e
声明为引用对象,这样它就会指向动态存储中的原始Example
,同时查看和行为类似于C ++标量。然后你可以安全地获取它的地址并删除它,获得所需的行为。但是,这非常简单,不应该在实际代码中使用。
1 严格地说,C ++标准中没有任何内容表明具有自动存储持续时间的对象必须在调用堆栈上,但是出于教学目的这样考虑它可能会有所帮助。