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

创建自定义类型对象时字段丢失求助:Member类int字段异常

分析你的Member指针数组初始化问题

嘿,我一眼就看出问题出在哪了——你只创建了装Member指针的数组,但每个指针根本没指向一个真正初始化过的Member对象!

先拆解下你当前的代码:

void Tour::initiateMember() { this->sizeOfArrParticipants = 5; ptr = new Member*[sizeOfArrParticipants]; }

这行代码只是在堆上分配了一个能容纳5个Member*类型指针的数组空间,但数组里的每个指针都是野指针,指向的是内存里的随机地址。

为什么string字段看似正常,int字段却出问题?

  • string是C++的标准类,它的默认构造函数会自动初始化内部的内存和状态,哪怕你是通过野指针访问,大概率不会立刻崩溃(但这依然是未定义行为!);
  • 而int是基本数据类型,没有默认构造函数来初始化值,野指针指向的内存里的int值就是随机的垃圾数据,这就是你看到的异常情况。

怎么修复?

你需要遍历这个指针数组,给每个指针分配一个真正的Member实例,调用它的构造函数来初始化所有字段:

void Tour::initiateMember() { 
    this->sizeOfArrParticipants = 5; 
    ptr = new Member*[sizeOfArrParticipants]; 
    // 逐个初始化每个Member指针
    for (int i = 0; i < sizeOfArrParticipants; ++i) {
        // 调用Member的默认构造函数,初始化所有字段
        ptr[i] = new Member(); 
        // 如果你的Member有带参数的构造函数,也可以这样初始化:
        // ptr[i] = new Member("张三", "zhangsan@example.com", 30);
    }
}

别忘了处理内存泄漏!

用原始指针的话,一定要记得在Tour类的析构函数里释放内存,不然会造成内存泄漏:

Tour::~Tour() {
    // 先释放每个Member实例
    for (int i = 0; i < sizeOfArrParticipants; ++i) {
        delete ptr[i];
    }
    // 再释放指针数组本身
    delete[] ptr;
}

更安全的替代方案:用智能指针

如果不想手动管理内存,推荐用C++11以后的智能指针和容器,比如std::unique_ptr搭配std::vector,这样不用手动写析构函数,智能指针会自动帮你释放内存:

#include <memory>
#include <vector>

class Tour {
private:
    int sizeOfArrParticipants;
    std::vector<std::unique_ptr<Member>> participants;
public:
    void initiateMember() {
        sizeOfArrParticipants = 5;
        for (int i = 0; i < sizeOfArrParticipants; ++i) {
            // 直接创建并初始化Member对象
            participants.emplace_back(std::make_unique<Member>());
            // 带参数的话:
            // participants.emplace_back(std::make_unique<Member>("李四", "lisi@example.com", 28));
        }
    }
    // 不需要手动编写析构函数,vector和unique_ptr会自动清理内存
};

内容的提问来源于stack exchange,提问作者anderssinho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:14