Сообщение об ошибке подтверждения отладки

По какой-то причине, когда я использую деструктор для своего класса 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

Решение

Вы должны изменить эту строку:
дата [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],

1

Другие решения

Проблема в том, что вы вызываете деструктор явно:

u1.Update::~Update();

таким образом, он вызывается дважды, вызывая неопределенное поведение, я полагаю, delete [] date; вызывается дважды, второй раз уже освобожденной памяти.

Другая проблема в вашем коде заключается в том, что вы используете пустой указатель для своего массива:

int * date;

это на самом деле довольно низкоуровневый стиль программирования в C ++ и может вызвать много проблем. Вы должны реализовать конструктор копирования класса и оператор присваивания (*), который будет выделять новый массив дат при копировании вашего класса обновления, в противном случае у вас снова будут проблемы с удалением нескольких указателей даты.

Лучший способ — использовать вектор как

std::vector<int> date;

(*) Я думаю, что хорошая ссылка, где правило три (или после C ++ 11 правило пять), которое применяется здесь, объясняется: Правило Три становится Правилом Пяти с C ++ 11?

2

По вопросам рекламы [email protected]