У меня есть класс Foo
, определенный следующим образом:
class Foo
{
public:
Foo(int num);
Foo(const Foo& other);
~Foo();
Foo& operator=(const Foo& other);
...
private:
string *fooArray;
void clearMemory();
...
}
Foo::Foo(int num)
{
fooArray = new string[num];
}
Foo::Foo(const Foo& other)
{
*this = other;
}
Foo::~Foo()
{
clearMemory();
}
Foo& operator=(const Foo& other)
{
clearMemory();
fooArray = new string[other.size]; // size is a private variable
memcpy(fooArray, other.fooArray, other.size * sizeof(string));
}
void Foo::someOtherFooFuncion(int newNum)
{
clearMemory(); // crash with Visual Studio, does not crash with g++, but g++ also
// crashes when destructor is called
fooArray = new string[newNum];
}
void Foo::clearMemory()
{
if(fooArray != NULL)
{
delete[] fooArray; // sometimes it crashes here with g++; it always crashes when
// compiling in Visual Studio
fooArray = NULL;
}
}
Как отмечается в комментариях к коду, он иногда дает мне сбои. Я попытался выполнить шаги в GDB, я дошел до
destructing Foo:
@0x7fff5fbff9b0
$26 = {
fooArray = 0x1001009d8,
...
}
И тогда delete[] fooArray
достигается, и вдруг
Foo(49858) malloc: *** error for object 0x100100990: pointer being freed was not allocated
Понятия не имею, откуда взялся 0x100100990.
Я понимаю, что код очень неполный, но я действительно даже не знаю, с чего начать поиск ошибки, и хотел бы дать несколько советов о том, какие возможные условия могут вызвать ошибки delete[]
.
EDIT
Добавлены c'tor, d'tor и оператор присваивания. Я не на ПК, поэтому код может быть не на 100% точным. Присвоение значений для fooArray и доступ к ним работает очень хорошо.
Кроме того, я был бы очень признателен за общий список проблем, которые потенциально могли бы вызвать delete[]
выдачу ошибки, чтобы я мог хотя бы иметь представление о том, где искать в коде.
РЕДАКТИРОВАТЬ 2 :
Итак, я последовал совету Xeo по использованию std::uninitialized_copy
, теперь код работает нормально и компилируется под g ++. Деструктор также отлично работает в Visual Studio, но каким-то образом удаление fooArray в someOtherFooFuncion
приводит к сбою.
Есть еще идеи?