c++ - 如何防止函数释放局部变量的内存?
问题描述
我正在尝试通过存储函数的地址来保存函数中的局部变量。但是,编译器似乎会自动释放该变量的内存,即使我将它的地址存储到指针变量中也是如此。
我处于一种情况(与下面的代码不完全一样),我必须让一个类的成员变量存储在函数中声明的变量的地址。
#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,而且在我重新运行脚本的很多时候都不同。我相信分配给a
in的内存foo
会被自动释放。*p
尽管有任何延迟,我如何确保是 5?
解决方案
解决方案 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
}
但为什么?
通常,当给出一个好的答案时,理解提问者为什么想做某事是有帮助的。您没有提供任何有关您为什么要这样做的信息,所以我不知道(具体)要提出什么建议。
推荐阅读
- php - 如何在 PHP 中将准备好的语句与 Postgres 一起使用
- c - 无序修改警告
- flutter - Flutter 中的标准输入和输出操作
- qpython - 使用 androidhelper 获取电池温度
- django - 如何在我的自定义身份验证视图(django-rest-framework-simplejwt)中设置 cookie?
- keras - Pytorch 如何使用线性激活函数
- javascript - 如何从具有 AJAX 请求的网站获取 HTML 页面而不会出现 CORS 错误?
- c - 程序找不到矩阵的转置
- shared-libraries - 加载时重定位如何处理共享共享库?
- python - 使用 markdown2 将 Markdown 表转换为 HTML