Других, что у вас есть несоответствующие 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
, которая может использоваться для выделения пространства для и построения объектов.
Это называется * деструктор *, как в уничтожении. Не деконструктор. :) – jalf 2010-12-03 15:30:23
@jalf Правильно, извините. – Maxpm 2010-12-03 17:09:48