-1

我有这段代码,它给了我分段错误。

struct TRecord {
    const char * Id;
    const char * Name;
};
class CClass {
    CClass ();
    ~CClass ();
    bool Add ( const char * id, const char * name);
    TRecord ** m_record;
    int m_count;
};

CClass::CClass (void) {
    m_count = 0;
    m_record = new TRecord * [1000];
}

CClass::~CClass(void) {
    for(int i=0;i<m_count;i++){
        delete m_record[i];
    }
    delete [] m_record;
}

bool CClass::Add (const char * id, const char * name) {
    m_record[m_count] -> Id = new char[11];
    m_record[m_count] -> Name = new char[strlen(name) + 1];

    m_record[m_count] -> Id = id;
    m_record[m_count] -> Name = name;

    m_count++;
    return true;
}

如果我添加例如 const char haha​​[2222]; 构造TRecord,它可以工作。我不明白为什么。你能帮助我吗?

PS我不能使用字符串。

4

2 回答 2

1

一个错误是您在 CRegister 类中没有遵循三原则。这通常会导致段错误。

另一个错误是您没有初始化 m_record[i] 指针。所以你的析构函数可能会在垃圾值上调用 delete[] 。

第三个错误是您显然在 CRegister::Add 中取消引用相同的垃圾值。

于 2013-04-09T20:37:24.083 回答
1

将此行添加到Add函数声明的顶部,它将解决您的Segmentation Fault问题。

m_record[m_count] = new TRecord;

但是正如您在答案和评论中看到的那样,您的代码有很多问题。最重要的问题是您对垃圾对象没有任何好的计划。所以你的代码有内存泄漏。

于 2013-04-09T20:40:56.587 回答