You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:42:31