Этот тип ошибки обычно связан с множественным удалением (или освобождением) одного и того же указателя или с некоторыми более непонятными ситуациями (получение из одной кучи и освобождение в другую кучу, но это, вероятно, здесь не так).
Первое, что я хотел бы сделать, это посмотреть деструкторы и убедиться, что вы не копируете и не удаляете их вдвойне. Например, со следующим кодом:
// buggy!!!
struct test {
int * data;
test() : data( new int[5] ) {}
~test() { delete [] data; }
test( test const & rhs ) : data( rhs.data ) {}
test& operator=( test const & rhs ) {
data = rhs.data;
}
};
int main() {
test t1; // 5 ints allocated int t1.data
test t2( t1 ); // no memory allocated, t2.data == t1.data
} // t2 out of scope: t2.~test() => delete t2.data
// t1 out of scope: t1.~test() => delete t1.data but both are the same: double delete
Если это так, вы можете решить, хотите ли вы иметь мелкие копии или делать глубокие копии. Во втором случае конструктор копирования (и оператор присваивания) должен выделить свою собственную память, а во втором случае вы должны убедиться, что память не освобождается дважды.
Как всегда с указателями, лучше делегировать управление ресурсами внешним (предварительно созданным) классам. В случае уникального владельца (и глубоких копий) вам, вероятно, следует использовать std::auto_ptr
(или std::unique_ptr
в C ++ 0x - или варианты наддува). Во втором случае использование boost::shared_ptr
(или std::shared_ptr
в C ++ 0x) обеспечит общий доступ к данным и их удаление только один раз.