2016-04-27 11 views
-2

問題はタイトルで、削除命令の直前にデバッグするとポインタ(ベクトル)が正常であることがわかりますが、VC++ Express2013の直後のウィンドウで値を変更することもできますプリミティブベクトルの削除例外をスローする

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

私のベクトルは、このクラスのベクトルである:それは例外をスロー削除私は値のキーとstd ::文字列をint型を使用したテンプレートで

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; 
}; 

を、ベクトルこの方法でのみ割り当てられます:

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; 
} 
このベクターを用いて

より複雑な操作はここにある:助けるため

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

感謝:

 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); 
    } 

、ここではデストラクタです。

+0

DIdあなたは一度に一つを削除しようとしましたか?あなたは、ベクターを構築し、それを後で削除することから始めることができます。エラーが表示されるまで、コードを追加してください。 – Quest

+0

'Key'または' Value'のいずれかに使用される実数型が自明でない場合、 'memcpy'の使用は無効であり、結果は未定義です。代わりに 'std :: copy'を使いたいかもしれません。 –

答えて

1

例外は、あなたのコード(またはむしろCRT)が値0xABABABABのメモリ位置に書き込みを試みたことを示します。デバッガでは、この値を設定してバグを見つけやすくします。それは意味:この例外はdeleteに由来

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

ので、それはあなたには、いくつかのメモリバッファを上書きすることによって、ヒープが破損しているいずれかのことを意味し、またはあなたはダングリングポインタを削除しようとしています。

疑問に思うものは、memcpyを使用してelementsをコピーしていることです。あなたは単純なタイプのみをmemcpyする必要があります。 - それはTriviallyCopyableタイプについてmemmoveを使用し、それ以外の要素を一つずつコピーします

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

その常により良いstd::copyを使用するには:それはケースの静的アサーションを使用しているかどうかを確認するには

このようなバグが発生しないようにするには、動的配列の代わりにstd::vectorを使用する必要があります。ポインタが必要な場合は、std::unique_ptrを使用します。 <algorithm>ヘッダーのさまざまな機能と組み合わされています。

+0

助けてくれてありがとう、memcpyをstd :: copyで変えてくれてありがとう。 – 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インスタンスから別のインスタンスに?

この場合、割り当てられたポインタを1回だけ解放してもよろしいですか?

関連する問題