По какой-то причине, когда я использую деструктор для своего класса Update, появляется сообщение об ошибке подтверждения отладки …
вот мой класс Update с некоторым кодом, опущенным для краткости. Размещено в заголовочном файле:
using namespace std;
class Update
{
private:
int day, month, year;
static const int FIELD_SIZE = 3, DEFAULT_DAY = 12, DEFAULT_MONTH = 12,
DEFAULT_YEAR = 1999, DAYS_IN_MONTH = 30, MONTHS_IN_YEAR = 12, DAYS_IN_YEAR = 365;
int * date;
public:
static int dateUpdate;
Update(int D, int M, int Y)
{
day = D;
if (day < 1 || day > DAYS_IN_MONTH)
day = DEFAULT_DAY;
month = M;
if (month < 1 || month > MONTHS_IN_YEAR)
month = DEFAULT_MONTH;
year = Y;
if (year < 1)
year = DEFAULT_YEAR;
date = new int [FIELD_SIZE];
date[0] = day, date[1] = month, date[2] = year;
dateUpdate++;
}
~Update()
{
delete [] date;
dateUpdate--;
}
};
и вот мой класс тестера в файле cpp:
#include <iostream>
#include "Update.h"
int Update::dateUpdate = 0;
int main()
{
Update u1(29, 12, 2000);
u1.Update::~Update();
return 0;
}
Я прочитал другие вопросы, касающиеся сбоев отладочных утверждений, но что-то подсказывает мне, что отладочные сбои могут возникать различными способами. В результате я мало понимаю, почему для моего кода отображается сообщение об ошибке … Что-то не так с моим деструктором, как я подозреваю, в данный момент? Большое спасибо за вашу помощь заранее!
Вы должны изменить эту строку:
дата [0] = день, дата [1] = месяц, дата [2] = год;
Для того, чтобы:
date[0] = day;
date[1] = month;
date[2] = year;
Вы используете оператор запятой, который возвращает результат последнего выражения. Это не то же самое, что запятая в инициализации.
Кроме того, в вашем main
функция, вам не нужно явно вызывать деструктор.
Ваш метод даты не может обработать 31 января или 31 декабря.
Вы можете получить доступ к параметрам функции напрямую, а не делать копию в функции. Например: day = D;
не нужен; получить доступ к параметру напрямую: if ((D < 1) ...
,
Если вы использовали целые числа без знака, вам не нужно проверять наличие отрицательных чисел. Я никогда не испытывал отрицательного дня, месяца или года в своей жизни.
Поскольку это C ++, а не Java или C #, вам не нужно динамически размещать переменные. Так что вместо использования int * date
вы могли бы использовать int date[3]
,
Проблема в том, что вы вызываете деструктор явно:
u1.Update::~Update();
таким образом, он вызывается дважды, вызывая неопределенное поведение, я полагаю, delete [] date; вызывается дважды, второй раз уже освобожденной памяти.
Другая проблема в вашем коде заключается в том, что вы используете пустой указатель для своего массива:
int * date;
это на самом деле довольно низкоуровневый стиль программирования в C ++ и может вызвать много проблем. Вы должны реализовать конструктор копирования класса и оператор присваивания (*), который будет выделять новый массив дат при копировании вашего класса обновления, в противном случае у вас снова будут проблемы с удалением нескольких указателей даты.
Лучший способ — использовать вектор как
std::vector<int> date;
(*) Я думаю, что хорошая ссылка, где правило три (или после C ++ 11 правило пять), которое применяется здесь, объясняется: Правило Три становится Правилом Пяти с C ++ 11?