Поскольку std::vector
будет копировать, std::vector<Payment>
требует, чтобы Payment
имел правильную семантику копирования.Ваш конструктор копирования и оператор присваивания не реализованы правильно.Оператор присваивания вызывает утечки памяти, так как вам не удалось delete []
существующей памяти.
Самым простым решением является удаление с использованием члена char *type;
и просто использование std::string type;
.Тогда класс Payment
будет иметь правильную семантику копирования автоматически.
Учитывая, что поправки к вашему классу Payment
приведены ниже:
#include <algorithm>
//...
Payment::Payment() : day(0), amount(0), type(nullptr) {}
Payment::Payment(const Payment & p) : day(p.day), amount(p.amount), type(nullptr)
{
if ( p.type )
{
type = new char[strlen(p.type) + 1];
strcpy_s(this->type, strlen(p.type) + 1, p.type);
}
}
// Use the copy/swap idiom
Payment& Payment::operator=(const Payment &other)
{
Payment temp(other); // make a temporary copy
// swap out contents of temporary with this object
std::swap(temp.day, day);
std::swap(temp.amount, amount);
std::swap(temp.type, type);
return *this;
} // when this brace has been reached, the temp copy dies off with the old data
Payment::~Payment()
{
delete [] type;
}
Выше используется идиома копирования / обмена в операторе присваивания.Конструктор копирования использует список инициализации члена.
Деструктору не нужно проверять нулевой указатель, поскольку удаление nullptr совершенно допустимо.