C++ int*包装类返回随机大数而非赋值整数的原因
问题原因及修复方案
核心原因
你的代码输出随机值的根本问题是野指针访问导致的未定义行为:
- 构造函数
Number(int32_t value)的参数是值传递,value是构造函数内部的局部变量,它的内存仅在构造函数执行期间有效。 - 构造函数执行完毕后,
value的内存会被系统回收,但你让value_32指针指向了这个局部变量的地址。此时value_32成为野指针,指向的是已被释放的内存区域。 - 后续在
main中访问*(n->value_32)时,读取的是已回收内存中的随机内容,因此会输出不可预测的大数。
修复方案
根据你的需求,有几种可行的修复方式:
1. 动态分配内存(需要指针的场景)
如果确实需要用指针持有独立的数值内存,可在构造函数中动态分配内存,同时添加析构函数释放内存避免泄漏:
#include <bits/stdc++.h> using namespace std; class Number { public: int32_t* value_32; Number(int32_t value) { // 动态分配内存存储值 value_32 = new int32_t(value); } // 析构函数释放内存 ~Number() { delete value_32; } }; int main() { int32_t v = 13; Number* n = new Number(v); cout << *(n->value_32) << "\n"; // 释放n的内存 delete n; }
2. 直接存储数值(无需指针的场景)
如果只是简单包装数值,完全不需要指针,直接把成员变量改成值类型更安全高效:
#include <bits/stdc++.h> using namespace std; class Number { public: int32_t value_32; // 用初始化列表初始化成员变量 Number(int32_t value) : value_32(value) {} }; int main() { int32_t v = 13; Number* n = new Number(v); cout << n->value_32 << "\n"; delete n; }
3. 指向外部变量(需保证生命周期)
如果要让Number的指针指向外部已存在的变量,需直接传入指针,且确保外部变量的生命周期长于Number对象:
#include <bits/stdc++.h> using namespace std; class Number { public: int32_t* value_32; // 直接接收外部变量的指针 Number(int32_t* value) : value_32(value) {} }; int main() { int32_t v = 13; // 传入v的地址 Number* n = new Number(&v); cout << *(n->value_32) << "\n"; delete n; }
内容的提问来源于stack exchange,提问作者KarmaPenny
相关产品推荐
相关产品推荐

