C++ 通过函数内的指针删除
考虑C++ 通过函数内的指针删除,c++,pointers,C++,Pointers,考虑 void d(int* t) { //pointer passed by value delete t; std::cout << *t << '\n'; } 在第一种情况下(d(y)),我的理解是创建了指针的副本 在第二种情况下,我的理解是通过引用传递它,所以仍然有一个指针指向y 在这两种情况下,我都希望: std::cout << *t << '\n'; std::cout “cause UB”/“但我仍然可以成功
void d(int* t) { //pointer passed by value
delete t;
std::cout << *t << '\n';
}
- 在第一种情况下(d(y)),我的理解是创建了指针的副本
- 在第二种情况下,我的理解是通过引用传递它,所以仍然有一个指针指向y
std::cout << *t << '\n';
std::cout
“cause UB”/“但我仍然可以成功地取消引用它,就像”delete t;“什么也没做,为什么?”
“成功”是指它可以编译,但不是“成功”是指“不必担心UB”。为什么?因为编译器没有试图(或预期)在编译期间为您的运行时程序状态建模:您的工作是确保您的程序不会在运行时尝试具有未定义行为的内容
在第二种情况下,我的理解是通过引用传递它,所以仍然有一个指针指向y
不。。。您没有指向y
的任何指针。。。您有一个对y
的引用。无论如何,int
在delete t
之后就不存在了,反之亦然:当你复制指针时,调用d()
而不是d2()
,调用方的y
副本不受影响,成为指向int
过去所在位置的悬空指针(这是完全无用的)。此外,如果d(y)然后调用代码>d2(y)代码>在delete t处具有未定义的行为代码>语句,而不仅仅是*t
“cause UB”/“但我仍然可以成功地取消引用它,就像”delete t;“什么也没做,为什么?”
“成功”是指它可以编译,但不是“成功”是指“不必担心UB”。为什么?因为编译器没有试图(或预期)在编译期间为您的运行时程序状态建模:您的工作是确保您的程序不会在运行时尝试具有未定义行为的内容
在第二种情况下,我的理解是通过引用传递它,所以仍然有一个指针指向y
不。。。您没有指向y
的任何指针。。。您有一个对y
的引用。无论如何,int
在delete t
之后就不存在了,反之亦然:当你复制指针时,调用d()
而不是d2()
,调用方的y
副本不受影响,成为指向int
过去所在位置的悬空指针(这是完全无用的)。此外,如果d(y)然后调用代码>d2(y)代码>在delete t处具有未定义的行为代码>语句,而不仅仅是*t
“cause UB”/“但我仍然可以成功地取消引用它,就像”delete t;“什么也没做,为什么?”
“成功”是指它可以编译,但不是“成功”是指“不必担心UB”。为什么?因为编译器没有试图(或预期)在编译期间为您的运行时程序状态建模:您的工作是确保您的程序不会在运行时尝试具有未定义行为的内容
在第二种情况下,我的理解是通过引用传递它,所以仍然有一个指针指向y
不。。。您没有指向y
的任何指针。。。您有一个对y
的引用。无论如何,int
在delete t
之后就不存在了,反之亦然:当你复制指针时,调用d()
而不是d2()
,调用方的y
副本不受影响,成为指向int
过去所在位置的悬空指针(这是完全无用的)。此外,如果d(y)然后调用代码>d2(y)代码>在delete t处具有未定义的行为代码>语句,而不仅仅是*t
“cause UB”/“但我仍然可以成功地取消引用它,就像”delete t;“什么也没做,为什么?”
“成功”是指它可以编译,但不是“成功”是指“不必担心UB”。为什么?因为编译器没有试图(或预期)在编译期间为您的运行时程序状态建模:您的工作是确保您的程序不会在运行时尝试具有未定义行为的内容
在第二种情况下,我的理解是通过引用传递它,所以仍然有一个指针指向y
不。。。您没有指向y
的任何指针。。。您有一个对y
的引用。无论如何,int
在delete t
之后就不存在了,反之亦然:当你复制指针时,调用d()
而不是d2()
,调用方的y
副本不受影响,成为指向int
过去所在位置的悬空指针(这是完全无用的)。此外,如果d(y)然后调用代码>d2(y)代码>在delete t处具有未定义的行为代码>声明,不仅仅是*t
你认为“UB”是什么意思?@BenjaminLindley:哈哈,不错!好的,这意味着未定义的行为。但是你认为未定义的行为意味着什么?尽管它指的是在其作用域之外访问局部变量的内存(这在技术上与你所问的不同),但它为你的问题提供了一个同样好的答案。你认为“UB”意味着什么?@BenjaminLindley:哈哈,好的!好的,这意味着未定义的行为。但是你认为未定义的行为意味着什么?尽管它指的是在其作用域之外访问局部变量的内存(这在技术上与你所问的不同),但它为你的问题提供了一个同样好的答案。你认为“UB”意味着什么?@BenjaminLindley:哈哈,好的!好的,这意味着未定义的行为。但是你认为未定义的行为意味着什么?尽管它指的是在其作用域之外访问局部变量的内存(这在技术上与你所问的不同),但它为你的问题提供了一个同样好的答案。你认为“UB”意味着什么?@BenjaminLindley:哈哈,好的!好的,这意味着未定义的行为。但你觉得我的行为如何
int *y = new int{22};
d(y);
d2(y);
std::cout << *t << '\n';