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

不使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:18:01