2013-04-09 34 views
-1

我有这段代码,它给我分段错误。const在结构类中的字符char - 分段错误

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,它的工作原理。我不明白为什么。你可以帮我吗?

P.S.我不能使用字符串。

+0

哪种方法可以调用哪个对象来产生分段错误? – Oswald 2013-04-09 20:37:00

+2

是一个完整的小例子太多要问? – Beta 2013-04-09 20:37:47

+0

这条线是无效的C++:'m_record = new TRecord * [1000];' – 2013-04-09 20:42:44

回答

1

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

m_record[m_count] = new TRecord; 

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

+0

这个代码很多很多问题之一 – 2013-04-09 20:41:59

+0

啊,我忘了这个:/谢谢! – user2171413 2013-04-09 20:42:56

+0

@DanF是的,但我认为这行代码将工作。 – MostafaR 2013-04-09 20:42:58

1

一个错误是,您没有按照CRegister类中的rule of three。这通常会导致段错误。

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

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