Что радует в вашем коде:
Здесь вы динамически создаете объект. (это не освобождается в вашем коде).
Почему вы используете указатель? (Умный указатель твой друг.)
Но нормальный объект предпочтительнее.
Column *c = new Column("Test");
Теперь вы создаете копию объекта во время его копирования во временный объект типа std :: pair (при этом используется конструктор копирования Column, который создает копию члена M_name (теперь у вас есть два указателя) в ту же ячейку памяти)).
std::make_pair(0, *c)
Теперь вы вставляете пару в карту. Это снова делается с помощью конструктора копирования Column (он использует конструктор копирования make_pair, который вызывает конструктор копирования Column). Снова указатель M_name копируется в этот объект. Итак, теперь у вас есть три объекта, указывающих на динамически распределенную строку.
m_Container->insert( pairObject )
В этот момент временный объект, который вы создаете с помощью вызова std :: make_pair (), больше не нужен, поэтому он уничтожается. Это то место, где вас называют деструктором. Конечно, это оставляет вас с двумя объектами с указателем на память, которая была освобождена.
У вас большая проблема.
Вам нужно либо использовать std :: string (предпочтительное решение)
Или вам нужно правильно обработать RAW-указатель в вашем классе. Это означает, что вам нужно реализовать все четыре сгенерированных по умолчанию метода:
- Конструктор
- destructror
- конструктор копирования
- оператор присваивания
Небольшая проблема:
Вам нужно прекратить кодировать, как программисту Java.
Column *c = new Column("Test");
it = this->m_Container->insert(std::make_pair(0, *c)).first;
Должно выглядеть так:
m_Container[0] = Column("Test");
Нет необходимости динамически распределять все.
Факт, который очень опасен.
Объяснение, почему наличие указателя в RAW - плохая идея.
class X
{
char* m_name;
public:
X(char const* name) {m_name new char[strlen(m_name) +1];strcpy(m_name,name);}
~X() {delete [] m_name;}
};
Это выглядит хорошо. Но компилятор также генерирует два метода для вас. В большинстве случаев это нормально, но не при наличии указателя в RAW.
X::X(X const& copy)
:m_name(copy.m_name)
{}
X& X::operator=(X const& copy)
{
m_name = copy.m_name;
}
Теперь изобразите код:
X x("Martin");
X y(x);
Оба x и y теперь содержат одинаковые указатели (m_name), указывающие на один и тот же фрагмент памяти. Когда 'y' выходит из области видимости, он вызывает свой derstructor, который вызывает delete [] в памяти. Теперь 'x' выходит из области видимости и вызывает delete для того же фрагмента памяти.
Z z("Bob");
z = x;
Та же проблема, что и выше, но с использованием другого оператора.
Как это относится к вам?
Вы используете карту указателя на столбец. Карта на самом деле хранит объект Coloumn. Так что он использует конструктор Copy выше, чтобы сделать копию вашего объекта. Так что есть проблема. Но также и в коде много раз, когда временные объекты создаются и передаются.
doWork(Column const& x) { /* Do somthing intersting */
doWork(Column("Hi There"));
Здесь мы создаем временный объект Column, который передается в doWork (). Когда doWork () завершится, временная область выходит из области действия и удаляется. Но что произойдет, если doWork () сделает копию объекта, используя либо конструктор копирования, либо оператор присваивания? Это то, что происходит, когда вы вставляете объект в карту. Вы создаете временную пару, а затем копируете это значение в карту. Эта временная пара затем уничтожается.