创建自定义类型对象时字段丢失求助: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
相关产品推荐
相关产品推荐

