C++代码打印*pointer时出现内存错误:原因分析及修复方法
问题原因分析
- 指针参数传递错误:
get_progress函数的参数int* int_get_progress是值传递,函数内修改的只是该参数的局部副本,全局变量int_get_progress完全没被更新。main函数里依然解引用初始的空指针0,直接触发内存访问错误。 - 局部变量生命周期问题:就算参数传递正确,让指针指向函数内的局部变量
n,函数执行完毕后局部变量的栈内存会被释放,后续访问该指针会变成野指针,同样会导致未定义行为。
修复方案
提供几种实用的修复方式:
方式一:使用指针的指针(修改全局指针)
将函数参数改为指针的指针,以此真正修改全局指针变量,同时把进度变量设为静态,避免生命周期问题:
#include <iostream> int* int_get_progress = 0; void get_progress(int** int_get_progress) { static int n = 100; // 静态变量生命周期与程序一致 *int_get_progress = &n; std::cout << "get_report_progress:" << **int_get_progress << std::endl; } int main() { get_progress(&int_get_progress); std::cout << "main get process:" << *int_get_progress << std::endl; return 0; }
方式二:使用指针引用(更简洁的C++风格)
利用C++的引用特性,直接传递指针的引用,配合静态变量解决生命周期问题:
#include <iostream> int* int_get_progress = 0; void get_progress(int*& int_get_progress) // 指针的引用 { static int n = 100; int_get_progress = &n; std::cout << "get_report_progress:" << *int_get_progress << std::endl; } int main() { get_progress(int_get_progress); std::cout << "main get process:" << *int_get_progress << std::endl; return 0; }
方式三:直接使用全局变量存进度(最省心的方案)
如果进度是动态更新的场景,直接用全局变量存储进度值,无需折腾指针:
#include <iostream> int progress = 0; // 全局变量存进度 void get_progress() { progress = 100; // 更新进度值 std::cout << "get_report_progress:" << progress << std::endl; } int main() { get_progress(); std::cout << "main get process:" << progress << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Nick Lee
相关产品推荐
相关产品推荐

