2016-04-27 43 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实例到另一个实例?

在这种情况下,你确定只释放一次分配的指针吗?