堆上的对象和引用

5

在回答这个问题的时候,我有点困惑了。我们都知道这是因为C++的复制语义而正常工作的:

int *some_obj = new int(42);
int a_copy = *some_obj;

delete some_obj;

printf("The answer is %d\n", a_copy);

但这个怎么办呢?
int *some_obj = new int(42);
int& a_ref = *some_obj;

delete some_obj;

printf("The answer is %d\n", a_ref);

这是在访问已删除的内存吗?

这可能以各种形式被多次询问,但这对谷歌并不友好。天哪,我甚至无法拼出一个像样的标题。

2个回答

4

是的,确实如此。所以这是不允许的。(您可以通过使用具有更改值的析构函数的类来确保看到差异。)


现在我已经阅读了维基百科关于它的部分内容,在此章节的最后一段非常清楚地解释了它。那么,将对临时对象返回引用呢(其中A是某个随机类)A& func() { return A(); } - orlp
这个问题很常见。当调用方获取一个对象的引用时,你返回了一个已经不存在的对象的引用。 - David Schwartz

1

没错。第二个例子访问了已释放的内存。引用的实现是指针。非常简单。引用是一个不能被改变的指针,它有不同的访问操作符表示方式。除此之外,它们之间没有其他区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接