考虑
void d(int* t) { //pointer passed by value
delete t;
std::cout << *t << '\n';
}
和
void d2(int*& t) { //pointer passed by reference
delete t;
std::cout << *t << '\n';
}
说我们有:
int *y = new int{22};
d(y);
d2(y);
在这两种情况下,我都希望:
std::cout << *t << '\n';
导致不确定的行为,因为我应该删除t的值。但是我仍然可以成功取消引用它,就像“删除t;”一样。什么也没做。这是为什么?
“引起UB” /“但是我仍然可以成功取消引用它,就像”删除t;“什么也没做。为什么?
“成功”可以编译,但不能“成功”,例如“不必担心UB”。为什么?因为编译器在编译过程中没有尝试(或期望)对运行时程序状态进行建模,所以确保您的程序在运行时不会尝试具有未定义行为的行为是您的工作。
在第二种情况下,我的理解是我通过引用传递了它,所以仍然有一个指针指向y
不...您没有指向y
...的指针。您有对的引用y
。无论如何,int
s之后不存在s delete t
,而是相反的:当您复制指针时,调用d()
not时d2()
,调用者的副本y
不会受到影响,并成为指向int
s过去位置的悬挂指针(这完全没用) 。此外,如果d(y);
调用if,则d2(y);
在该delete t;
语句中具有不确定的行为,而不仅是*t
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句