首页 > 解决方案 > 如何防止函数释放局部变量的内存?

问题描述

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

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

#include <stdio.h>

static int* p;

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

int main(){
    foo();

    //some delay

    printf("*p = %d\n",*p);
}

理想情况下,*p应该是 5,但它最终不是 5,而且在我重新运行脚本的很多时候都不同。我相信分配给ain的内存foo会被自动释放。*p尽管有任何延迟,我如何确保是 5?

标签: c++pointers

解决方案


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

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

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

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

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

    // Do stuff with myPtr

    delete myPtr; // Free it, now that it's no longer needed.
}

潜在问题

当人们谈论必须在 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
}

但为什么?

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


推荐阅读