Управление памятью вектора - PullRequest
3 голосов
/ 02 октября 2011

У меня есть класс C ++ с личным членом «указатель на вектор» pV, я назначаю ему новый вектор в конструкторе ...

pV = new vector<FMCounter>(n, FMCounter(arg1))>;

Однако, когда я удаляю в деструкторе класса

delete pV;

Я получаю сообщение об ошибке и пытаюсь освободить pv, который не был выделен в первую очередь. Я проверил, что pV-> size () было 4K что-то, так что я уверен, что он был выделен памяти new.

1 Ответ

2 голосов
/ 02 октября 2011

Членам-указателям с семантикой владения (размещение в конструкторе и освобождение в деструкторе) обычно требуется написать собственный конструктор копирования и оператор присваивания (обычно известный как Правило трех ), поскольку генерируемые компилятором единицыпросто скопируйте указатель члена, а не его базовый объект.Поэтому, если вы в какой-то момент скопируете содержащий объект, в итоге вы получите два объекта с указателем, совпадающим с элементом, и второй уничтоженный объект попытается удалить уже удаленный указатель.

В самом простом случае вы должны убедиться, чтоконструктор копирования делает что-то вроде

TheClass::TheClass(const TheClass &rhs)
    : pV(new vector<FMCounter>(*rhs.pV))
{
}

, а оператор присваивания делает что-то вроде

TheClass& TheClass::operator=(const TheClass &rhs)
{
    *pV = *rhs.pV
    return *this;
}
...