我试图通过存储函数的地址来保存它的局部变量。但是,编译器似乎会自动释放该变量的内存,即使在我将其地址存储到指针变量之后也是如此。
我处于一种情况(与下面的代码不完全相同),我必须让类的成员变量存储在函数中声明的变量的地址。
#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?
如果您希望在函数退出后可以访问内存位置,您应该使用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一个对象可能很棘手,而且很容易把事情搞砸。
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)
通常,当给出一个好的答案时,理解提问的人为什么想要做某事是有帮助的。你没有提供任何关于你为什么要这样做的信息,所以我不知道(具体)建议什么。