Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过函数内的指针删除_C++_Pointers - Fatal编程技术网

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';