当我尝试以下代码时,似乎'删除'(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
答案 0 :(得分:8)
它 工作,你在refA
上所做的一切都会导致未定义的行为,即就标准而言,任何事情都可能发生,包括“它似乎有效”。
在实践中,目前它似乎有效,因为内存尚未被重用,但等待一些分配,你会发现你将覆盖其他不相关的对象。
请记住,当你进入“未定义的行为”时,如果你运气好的话,你会遇到崩溃或失败的断言;通常,你会得到一些奇怪的,不可重现的错误,这些错误偶尔会让你发疯。
嗯,我知道该引用不适合“引用稍后将被释放的对象”。我只是在玩代码..
引用将被释放的东西没什么不好......重要的是,在引用超出范围之后必须释放。例如,在这种情况下,它非常好:
A* ptrA = new A(10);
{
A &refA = *ptrA;
std::cout<<refA.val<<"\n";
}
delete ptrA;
答案 1 :(得分:2)
嗯,我知道该引用不适合“引用稍后将被释放的对象”
实际上你似乎还不太明白。当人们这样说时,并不意味着如果你试图这样做,就会发生错误或类似情况。这意味着所有赌注都已关闭,任何事情都可能发生。 “任何事物”都包括你观察到的行为。
这就是你不应该这样做的原因:你无法保证可能发生的事情,所以它基本上等于通过赌博进行编程。
答案 2 :(得分:1)
删除对象,您的代码会导致未定义的行为。在您的具体情况下,它会输出您想要的内容,但这不起作用,并且在一般情况下不起作用。