返回指向局部变量的指针总是未定义的行为
Is returning a pointer to a local variable always undefined behavior
我读到我们不应该 return 指针或对局部变量的引用。所以在下面给出的例子中,我明白当我写: return f;
inside function foo
时,我正在 returning 一个指向局部变量的指针。在函数外部使用该指针将导致未定义的行为。
#include <iostream>
const char* foo()
{
const char* f = "ffdf";
return f;//returning pointer to a local variable
}
const char* func()
{
return "fsfs";
}
int main()
{
const char* ptr = func();
const char* f = foo();
std::cout<<f<<std::endl; //I know this is undefined behavior because we're using a pointer that points to a local variable
std::cout<<ptr; //But IS THIS UNDEFINED BEHAVIOR too?
}
我的问题是函数 func
中的 return 语句 return "fsfs";
也是如此。我知道在 C++17 中有强制复制 elison。所以我的问题是针对所有现代 C++ 版本(C++11、C++17 等)。 C++ 版本上的行为 depends/differs。
特别是,我知道 main
中的语句 std::cout<<f<<std::endl;
始终是未定义的行为,因为我们使用的是指向局部变量的指针(悬挂)。但是语句 std::cout<<ptr;
是否也会导致未定义的行为。如果不是为什么以及这里会发生什么。
PS:我在描述第一个 cout
语句中实际发生的事情时也可能是错误的。所以如果我错了请纠正我。此外,我的初衷并不局限于特定类型,如字符串文字。例如,我可以选择 return 一个 int
而不是字符串文字,并将 return 类型设为 const int&
。但由于人们已经开始回答,我不会更改示例以使用 int
.
返回指向 non-static 函数局部变量的指针将导致您在调用站点获得的指针成为悬空指针,使用它会产生未定义的行为。
在这里,情况并非如此。字符串文字具有静态存储持续时间,这意味着它将一直存在到程序结束。这意味着 return 指向函数中声明的字符串文字的指针是安全的。
所以 foo
和 func
都是安全的,但是如果你
const char * bar()
{
std::string text = "some text";
// stuff
return text.c_str();
}
然后您将 return 指向不再存在的对象的指针,并且 UB 会尝试从该 returned 指针读取。
我读到我们不应该 return 指针或对局部变量的引用。所以在下面给出的例子中,我明白当我写: return f;
inside function foo
时,我正在 returning 一个指向局部变量的指针。在函数外部使用该指针将导致未定义的行为。
#include <iostream>
const char* foo()
{
const char* f = "ffdf";
return f;//returning pointer to a local variable
}
const char* func()
{
return "fsfs";
}
int main()
{
const char* ptr = func();
const char* f = foo();
std::cout<<f<<std::endl; //I know this is undefined behavior because we're using a pointer that points to a local variable
std::cout<<ptr; //But IS THIS UNDEFINED BEHAVIOR too?
}
我的问题是函数 func
中的 return 语句 return "fsfs";
也是如此。我知道在 C++17 中有强制复制 elison。所以我的问题是针对所有现代 C++ 版本(C++11、C++17 等)。 C++ 版本上的行为 depends/differs。
特别是,我知道 main
中的语句 std::cout<<f<<std::endl;
始终是未定义的行为,因为我们使用的是指向局部变量的指针(悬挂)。但是语句 std::cout<<ptr;
是否也会导致未定义的行为。如果不是为什么以及这里会发生什么。
PS:我在描述第一个 cout
语句中实际发生的事情时也可能是错误的。所以如果我错了请纠正我。此外,我的初衷并不局限于特定类型,如字符串文字。例如,我可以选择 return 一个 int
而不是字符串文字,并将 return 类型设为 const int&
。但由于人们已经开始回答,我不会更改示例以使用 int
.
返回指向 non-static 函数局部变量的指针将导致您在调用站点获得的指针成为悬空指针,使用它会产生未定义的行为。
在这里,情况并非如此。字符串文字具有静态存储持续时间,这意味着它将一直存在到程序结束。这意味着 return 指向函数中声明的字符串文字的指针是安全的。
所以 foo
和 func
都是安全的,但是如果你
const char * bar()
{
std::string text = "some text";
// stuff
return text.c_str();
}
然后您将 return 指向不再存在的对象的指针,并且 UB 会尝试从该 returned 指针读取。