2013-04-09 31 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中的相同垃圾值。