不使用vector在C++中创建大量同类型对象的段错误问题排查
解决创建Student指针数组时的段错误问题
嘿,我来帮你排查下这段代码里的问题,你的思路是对的——用指针数组来创建多个对象避免拷贝,但代码里有两个关键错误导致了段错误,咱们一个个拆解:
1. 未初始化的stname指针触发非法内存访问
在main函数里,你声明了char *stname;但没有给它分配内存空间,直接用cin >> stname的时候,程序会尝试把输入的名字写入一个随机的内存地址(未初始化的指针指向的是不确定的内存区域),这直接触发了段错误。
2. Student构造函数中内存分配的计算逻辑错误
在构造函数里,你写了name = new char[strlen(nam + 1)];,这里的括号位置完全错了:nam + 1是把指针往后偏移了一个字节,相当于从原字符串的第二个字符开始计算长度,而不是原字符串长度加1。这样分配的内存空间会比实际需要的小,后续strcpy的时候会越界写入,同样会导致段错误或者其他未定义行为。
修复后的完整代码
#include <iostream> #include <cstring> using namespace std; class Student { private: char *name; int no_floor; int no_classroom; public: Student(const char *nam, int no_fl, int no_cla) //constructor { // 修复:正确计算字符串长度+1(用于存储终止符'\0') name = new char[strlen(nam) + 1]; strcpy(name, nam); no_floor = no_fl; no_classroom = no_cla; cout << "A new student has been created! with name " << name << " heading to floor: " << no_floor << " class: " << no_classroom << endl; }; ~Student() //destructor { cout << "A Student to be destroyed! with name " << name << " is at floor: " << no_floor << " class: " << no_classroom << endl; delete[] name; }; }; int main(void) { int i, floor, classroom; // 修复:用固定大小的字符数组存储输入的名字,避免未初始化指针的问题 char stname[256]; // 假设名字最长不超过255个字符,可根据需求调整 typedef Student *stptr; stptr *students = new stptr[15]; for (i = 0; i < 15; i++) { cin >> stname; cin >> floor; cin >> classroom; students[i] = new Student(stname, floor, classroom); } // 别忘了清理内存,避免内存泄漏 for (i = 0; i < 15; i++) { delete students[i]; } delete[] students; return 0; }
额外注意事项
- 如果你不确定输入名字的长度,也可以先读取输入后再动态分配
stname的内存,但用固定大小数组在这个场景下更简单安全。 - 一定要记得在程序结束前释放所有动态分配的内存:先释放每个
Student对象,再释放存储指针的数组students,否则会造成内存泄漏。
内容的提问来源于stack exchange,提问作者ScatterBrainer
相关产品推荐
相关产品推荐

