C++"删除"具有引用的对象

C++ 'delete' an object which has a reference

本文关键字:对象 引用 删除 C++      更新时间:2023-10-16

似乎'delete'(C 中的免费内存)在尝试以下代码...好吧,我知道该参考不适合"指"参考以后将释放的对象"。我只是在播放代码。

class A{
public:
    int val;
    A(int val_=0):val(val_){}
};
A* ptrA = new A(10);
A &refA = *ptrA;
printf("%dn", refA.val);
delete ptrA;
refA.val = 100;
printf("%dn", refA.val);

输出是:10100

it dis 工作,您在refA上所做的一切都会导致不确定的行为,即就标准而言,可能发生的任何事情可能发生,包括"工作"。

实际上,目前似乎有效,因为该内存尚未重复使用,但是请等待一些分配,并且您会看到您将覆盖其他无关的对象。

请记住,当您进入"不确定的行为"时 - 如果幸运的话,您会出现崩溃或失败的断言;通常,您会得到奇怪的,不可复制的错误,偶尔会发生生气。

好吧,我知道参考不适合"参考以后将释放的对象"。我只是在播放代码。

提到将要释放的东西没有什么不好的……重要的一点是,它必须在之后释放,参考文献不超出范围。例如,在这种情况下,这很好:

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

好吧,我知道参考不适合"参考以后将在

上释放的对象

实际上,您似乎还不了解这一点。当人们这么说时,这并不意味着如果您尝试这样做,则会发生错误或类似。这意味着所有赌注都关闭了,任何事情都可能发生。"任何事物"包括您观察到的行为。

这就是为什么您不应该这样做:您无法保证可能发生的事情,因此基本上等于赌博。

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