C++ C++';删除';具有引用的对象

C++ C++';删除';具有引用的对象,c++,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.va

当我尝试以下代码时,“删除”(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

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

实际上,由于内存尚未被重用,目前它似乎可以工作,但请等待几次分配,您将看到您将覆盖其他不相关的对象

记住,当你进入“未定义的行为”时——如果你幸运的话,你会得到一个崩溃或失败的断言;通常,你会得到奇怪的,不可复制的错误,偶尔发生一次,让你发疯

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

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);
引用将被释放的东西并没有什么不好的。。。重要的一点是,必须在引用超出范围后释放它。例如,在这种情况下,这是非常好的:

A* ptrA = new A(10);
{
    A &refA = *ptrA;
    std::cout<<refA.val<<"\n";
}
delete ptrA;
A*ptrA=新的A(10);
{
A&refA=*ptrA;
标准::cout
我知道引用不适合“引用稍后将被释放的对象”

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


这就是为什么你不应该这样做:你对可能发生的事情没有任何保证,所以它基本上等同于赌博编程。

对象被删除,你的代码会导致未定义的行为。在你的特定情况下,它会输出你想要的东西,但在一般情况下,它不会工作,也不会工作。

你是什么意思“不起作用”?(你是对的,但我想理解你的推理)@Pubby:在我看来,ptrA指向的对象似乎没有被删除。我认为这会导致未定义的行为,所以我所看到的只是一种错觉。非常感谢。如果在释放内存后不使用引用会怎么样?@IanM_Matrix1:这是一个有趣的问题,我不确定答案;标准说在«引用应初始化为引用有效对象»,可解释为“初始化时对象必须有效”或“引用初始化的对象必须在引用的整个生命周期内有效”;我更倾向于第二种解释,但坦率地说,我不确定。无论如何,我更愿意谨慎行事,避免提及不明确的东西。