2010-11-29 88 views
0

這裏沒有什麼問題。調整動態數組大小後可能出現的問題

我創建動態數組:

m_elements = new struct element*[m_number_of_elements]; 
    for(int i = 0; i < m_number_of_elements; i++) 
    { 
     m_elements[i] = new struct element[m_element_size]; 
    } 

然後我試圖調整現有數組:

m_elements[m_number_of_elements] = create_more_elements(); 
    m_number_of_elements++; 

create_more_elements()是一個函數:

struct index* create_more_elements() 
    { 
     struct element* tmp = new struct element[m_number_of_elements] 
     return tmp; 
    } 

一般來說,這種片的代碼有效,但有時我會在不同的地方出現段錯誤。 segfaults是否與調整大小連接? 有什麼想法?

回答

4

你應該使用std::vector它,然後你可以用new爲新的struct分配內存並將她的指針推向vector,如果你刪除了你應該刪除指針。

+0

我同意你的意見,但我有大約1000行代碼,我希望不要改變一切)))。 – qutron 2010-11-29 14:50:32

0
m_elements[i] = new struct element[m_element_size]; 

這創建的尺寸m_element_sizeelement

陣列來動態地創建一個結構,只要使用new struct elementnew element或。

如果沒有你的數組中來初始化值,你甚至可能是最好不要存儲指針,但你的數組中的實際對象:

m_elements = new element[m_number_of_elements]; 

要「調整」的數組,你確實有分配一個新的更大的數組,複製新數組中的當前數組的內容,並刪除舊數組。

// Allocate new array 
element* newArray = new element[m_number_of_elements + 1]; 
// Copy old array content into new one 
memcpy(newArray, m_elements, m_number_of_elements * sizeof(element)]; 
// Delete old array 
delete[] m_elements; 
// Assign new array 
m_elements = newArray; 
// Keep new size 
m_number_of_elements += 1; 

但你絕對應該使用std::vector,這比簡單的,更聰明:

std::vector<element> elements; 

// Add an element 
Element element; 
... 
elements.push_back(element); 
1

試試這個:

std::vector<element> m_elements; 
m_elements.resize(m_number_of_elements); 

不要去手動管理的陣列,除非路線絕對有必要 - std::vector將做得更好,更好的測試,驗證,標準化和C++程序員衆多的理解。看我的代碼示例 - 甚至沒有一個newdelete語句,但此代碼還包含所有必需的內存管理。

P.S .:因爲這個問題被標記爲C++,所以無論您將它用作類型,您都不必編寫struct element,只需要element即可。這表明你來自C,所以我的建議是:在繼續你所做的事情之前瞭解STL,花一個小時學習如何使用標準容器類可以節省你許多天的手動調整,調試和bug-定影。特別是因爲一旦你學到了一個,你已經知道所有其他的80%。 :)

0

這是一個奇蹟,你甚至編碼的作品。基本上你在做什麼是覆蓋你的初始分配數組後的內存。在C++中,您不能調整數組大小,只能刪除它並新建一個新的數組。

element** tmp = new element*[m_number_of_elements]; 
for(int i = 0; i < m_number_of_elements; i++) 
{ 
    tmp[i] = m_elements[i] 
} 
delete m_elements; 
m_elements = tmp; 

m_elements[m_number_of_elements] = create_more_elements();  
m_number_of_elements++; 

但是,這真的很蹩腳。正如Svisstack指出的那樣,您應該使用std :: vector或任何其他合適的標準容器。

std::vector<element*> m_elements; 

// ... 

m_elements.push_back(create_more_elements());