use*_*570 3 c++ pointers function local undefined-behavior
我读到我们不应该返回局部变量的指针或引用。因此,在下面给出的示例中,我明白当我写:return f;inside function时foo,我返回一个指向局部变量的指针。在函数外部使用该指针将导致未定义的行为。
#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?
}
Run Code Online (Sandbox Code Playgroud)
return "fsfs";我的问题是,对于function 内部的return 语句是否同样适用func。我知道在 C++17 中存在强制复制 elison。所以我的问题针对所有现代 C++ 版本(C++11、C++17 等)。该行为是否取决于 C++ 版本/有所不同。
std::cout<<f<<std::endl;特别是,我知道里面的语句main始终是未定义的行为,因为我们使用指向局部变量的指针(悬空)。但该声明是否std::cout<<ptr;也会导致未定义的行为。如果不是,为什么以及这里会发生什么。
PS:我在第一个声明中描述实际发生的情况cout也可能是错误的。所以如果我错了请纠正我。另外,我的初衷并不局限于像字符串文字这样的特定类型。例如,我可以选择返回 anint而不是字符串文字,并将返回类型设置为const int&. 但由于人们已经开始回答,我不会更改要使用的示例int。
返回指向非静态函数局部变量的指针将导致您在调用站点获得的指针成为悬空指针,并且使用它将会产生未定义的行为。
在这里,情况并非如此。字符串文字具有静态存储持续时间,这意味着它将一直存在到程序结束。这意味着返回指向函数中声明的字符串文字的指针是安全的。
所以 和foo都是func安全的,但如果你有
const char * bar()
{
std::string text = "some text";
// stuff
return text.c_str();
}
Run Code Online (Sandbox Code Playgroud)
然后,您将返回一个指向不再存在的对象的指针,并且 UB 会尝试从该返回的指针中读取数据。