如何防止函数释放局部变量的内存?

-3 c++ pointers

我试图通过存储函数的地址来保存它的局部变量。但是,编译器似乎会自动释放该变量的内存,即使在我将其地址存储到指针变量之后也是如此。

我处于一种情况(与下面的代码不完全相同),我必须让类的成员变量存储在函数中声明的变量的地址。

#include <stdio.h>

static int* p;

void foo(){
    int a = 5;
    p = &a;
}

int main(){
    foo();

    //some delay

    printf("*p = %d\n",*p);
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,*p应该是 5,但它最终成为一个不是 5 的数字,而且在我重新运行脚本的大部分时间里它是不同的。我相信分配给ain的内存foo正在被自动释放。*p尽管有任何延迟,我如何确保是 5?

J. *_*rez 5

解决方案 1 - 使用 new 和 delete 动态分配内存

如果您希望在函数退出后可以访问内存位置,您应该使用new以下命令动态分配它:

int* foo() {
    int* p = new int(5); // Get pointer to int with value of 5
    return p; 
}
Run Code Online (Sandbox Code Playgroud)

因为该指针是用 分配的new,所以它会一直存在,直到你调用delete它:

int main() {
    int* myPtr = foo(); 

    // Do stuff with myPtr

    delete myPtr; // Free it, now that it's no longer needed.
}
Run Code Online (Sandbox Code Playgroud)

潜在问题

当人们谈论必须在 C++ 中进行手动内存管理时,这通常是他们的意思。弄清楚何时调用delete一个对象可能很棘手,而且很容易把事情搞砸。

解决方案2 -a函数退出后变量仍然存在,并且a每次调用函数时都一样

如果我们标记a为静态,那么每次调用该函数时它将具有相同的内存地址,并且不会被释放:

int* p;
void foo() {
    static int a = 5;

    p = a;
}

int main() {
    foo(); 

    // stuff...

    std::cout << *p << '\n'; // Prints 5, unless you modified *p
}
Run Code Online (Sandbox Code Playgroud)

但为什么?

通常,当给出一个好的答案时,理解提问的人为什么想要做某事是有帮助的。你没有提供任何关于你为什么要这样做的信息,所以我不知道(具体)建议什么。