Другие отметили, что вы не сопоставили new[]
с delete
, и вы должны изменить delete
на delete[]
, чтобы исправить это. Однако это только первая из ваших проблем.
Вам также необходимо реализовать (или, по крайней мере, объявить как закрытый) конструктор копирования и оператор присваивания копии. В противном случае подумайте о том, что происходит, когда вы делаете это:
{
Container c1;
Container c2(c1);
} // c2.~Container(); // frees the memory pointed to by 'BasePointer'
// c1.~Container(); // also frees the memory pointed to by 'BasePointer'.
Так как BasePointer
член как c1
, так и c2
указывает на один и тот же массив, он освобождается дважды.
Есть несколько более простых в использовании альтернатив:
Подумайте об использовании std::vector
везде, где вы могли бы использовать динамически распределенный массив. Поскольку ваш класс называется Container
, я предполагаю, что вы пытаетесь реализовать контейнер, владеющий ресурсами, поэтому, возможно, вы не захотите его использовать.
Попробуйте использовать boost::scoped_ptr
или std::unique_ptr
(если ваш компилятор поддерживает это) для управления владением указателем. Оба они подавляют генерацию неявно объявленного конструктора копирования, заставляя вас реализовать свой собственный, если вы на самом деле пытаетесь их использовать.
Даже если вы реализуете Container
, вы все равно должны воспользоваться преимуществами более примитивных контейнеров, чтобы выполнить тяжелую работу за вас (или, по крайней мере, переопределить эти примитивные контейнеры, чтобы тяжелая работа была объединена в небольшой набор коммунальные услуги).
Наконец, в качестве стилистической точки, вам не нужно использовать malloc
для контейнера. Стандартная библиотека предоставляет std::allocator
, который можно использовать для выделения пространства и создания объектов.