2016-04-27 71 views
-2

問題是標題,在刪除指令之前調試時,我可以看到指針(向量)很好,我甚至可以通過VC++ Express2013立即窗口修改它的值,但是之後在刪除它拋出異常:原始向量刪除拋出異常

Unhandled exception at 0x55ACDF62 (msvcp120d.dll) in BTREE.EXE: 0xC0000005: Access violation writing location 0xABABABAB. 

我的矢量是這個類的一個向量:

template<class Key, class Value> 
class Pair{ 
public: 
Pair(){ 
    key = Key(); 
    value = Value(); 
} 

Pair(Key key, Value value){ 
    this->key = key; 
    this->value = value; 
} 

Key key; 
Value value; 
}; 
在我使用int的關鍵和std ::字符串值模板

,矢量僅通過此方法分配:

使用該載體
Node(unsigned int max){ 
    nelements = 0; 
    nchilds = 0; 
    /*reserva espaço para os elementos e os nós filhos, cada vetor possui uma espaço adicional reservado*/ 
    elements = new Pair<Key, Value>[max]; 
    childs = new Node<Key, Value>*[max + 1]; 
    this->max = max; 

    for (unsigned int i = 0; i < max + 1; i++) 
     childs[i] = nullptr; 
} 

更復雜的操作在這裏:

 left->nelements = middle; 
    memcpy(left->elements, elements, sizeof(Pair<Key, Value>) * middle); 
    if (!leaf()){ 
     left->nchilds = middle + 1; 
     memcpy(left->childs, childs, sizeof(Node<Key, Value>*) * left->nchilds); 
    } 

,這裏是析構函數:

~Node(){ 
    for (unsigned int i = 0; i < nchilds; i++) 
      delete childs[i]; 
    delete[] childs; 
    delete[] elements; 
} 

感謝幫助。

+0

DId你試圖在一次消除一件事?您可以從構建矢量開始,然後刪除它。添加更多代碼,直到出現錯誤。 – Quest

+0

如果'Key'或'Value'的實際類型不重要,則使用'memcpy'無效,結果未定義。您可能想使用'std :: copy'代替。 –

回答

1

該異常說明您的代碼(或者說CRT)試圖在值爲0xABABABAB的內存位置寫入。在調試器下,Visual Studio設置此值以幫助查找錯誤。這意味着:

Used by HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory 

因爲這樣的例外從delete起源就意味着要麼你已經通過覆蓋一些內存緩衝區損壞堆,或者你正試圖刪除懸擺指針。

看起來有點可疑的一件事是,您正在使用memcpy來複制elements - 您應該只使用memcpy類型。要檢查,如果這是一個情況下,使用靜態斷言:

static_assert(std::is_trivially_copyable<Pair<Key, Value>>::value, "must be TriviallyCopyable type"); 

它總是更好地使用std::copy - 它將使用memmove爲TriviallyCopyable類型,否則會被拷貝一個元素之一。

爲防止出現此類錯誤,您應該使用std::vector而不是動態數組,如果您需要指針,則可以使用std::unique_ptr。結合<algorithm>標題的各種功能。

+0

感謝您的幫助,使用std :: copy更改memcpy真的有用,謝謝您的提示。 – user2542813

0

我看到你複製了分配的內存。

memcpy(left->elements, elements, sizeof(Pair<Key, Value>) * middle); 
    if (!leaf()){ 
     left->nchilds = middle + 1; 
     memcpy(left->childs, childs, sizeof(Node<Key, Value>*) * left->nchilds); 
    } 

Node實例到另一個實例?

在這種情況下,你確定只釋放一次分配的指針嗎?