C ++'删除'一个有引用的对象

时间:2012-12-23 17:26:35

标签: c++

当我尝试以下代码时,似乎'删除'(C ++中的可用内存)不起作用... 好吧,我知道这个引用不适合“引用稍后将被释放的对象”。我只是在玩代码..

class A{
public:
    int val;
    A(int val_=0):val(val_){}
};

A* ptrA = new A(10);
A &refA = *ptrA;
printf("%d\n", refA.val);
delete ptrA;
refA.val = 100;
printf("%d\n", refA.val);

输出是: 10 100

3 个答案:

答案 0 :(得分:8)

工作,你在refA上所做的一切都会导致未定义的行为,即就标准而言,任何事情都可能发生,包括“它似乎有效”。

在实践中,目前它似乎有效,因为内存尚未被重用,但等待一些分配,你会发现你将覆盖其他不相关的对象。

请记住,当你进入“未定义的行为”时,如果你运气好的话,你会遇到崩溃或失败的断言;通常,你会得到一些奇怪的,不可重现的错误,这些错误偶尔会让你发疯。

  

嗯,我知道该引用不适合“引用稍后将被释放的对象”。我只是在玩代码..

引用将被释放的东西没什么不好......重要的是,在引用超出范围之后必须释放。例如,在这种情况下,它非常好:

A* ptrA = new A(10);
{
    A &refA = *ptrA;
    std::cout<<refA.val<<"\n";
}
delete ptrA;

答案 1 :(得分:2)

  

嗯,我知道该引用不适合“引用稍后将被释放的对象”

实际上你似乎还不太明白。当人们这样说时,并不意味着如果你试图这样做,就会发生错误或类似情况。这意味着所有赌注都已关闭,任何事情都可能发生。 “任何事物”都包括你观察到的行为。

这就是你不应该这样做的原因:你无法保证可能发生的事情,所以它基本上等于通过赌博进行编程。

答案 2 :(得分:1)

删除对象,您的代码会导致未定义的行为。在您的具体情况下,它会输出您想要的内容,但这不起作用,并且在一般情况下不起作用。