我可以通过将指向堆栈变量的指针传递给C++中的函数来得到指向非预期位置的指针吗?

the*_*rld 2 c++ heap stack object

我知道编译器优化有时会导致堆栈帧的波动.所以我的问题是,在c ++中创建堆栈指针并将其传递给另一个函数并期望它指向被调用者中的同一个对象是否总是安全的.由于编译器优化,是否有可能最终指向不期望的位置.

例如,对于任何编译器,这总是安全的吗?

int main(){
   std::ofstream f("somefile");
   foo(&f);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者我应该使用堆来获得一致的结果.

int main(){
   std::ofstream *f=new std::ofstream("somefile");  
   foo(f);
   close(*f);
   delete f;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 5

当存在一个指向生命周期结束的对象的指针时,会创建一个悬空指针:

std::string* s;
{
    std::string s1("hello");
    s = &s1;
}
// 's' now a dangling pointer because 's1' has been destructed.
Run Code Online (Sandbox Code Playgroud)

在任何一个发布的代码片段中都不存在这种情况,因此两者都是安全的.(虽然第一个是优选的,因为它避免了不必要的动态内存分配).