C++"删除"具有引用的对象
C++ 'delete' an object which has a reference
似乎'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;
好吧,我知道参考不适合"参考以后将在
上释放的对象
实际上,您似乎还不了解这一点。当人们这么说时,这并不意味着如果您尝试这样做,则会发生错误或类似。这意味着所有赌注都关闭了,任何事情都可能发生。"任何事物"包括您观察到的行为。
这就是为什么您不应该这样做:您无法保证可能发生的事情,因此基本上等于赌博。
对象已删除,您的代码会导致不确定的行为。在您的具体情况下,它会输出您想要的内容,但这将不起作用,并且在通常的情况下将不起作用。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则