繁体   English   中英

调试断言失败消息

[英]Debug assertion failed message

由于某种原因,当我将析构函数用于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;
}

我通读了涉及调试断言失败的其他问题,但是有一些告诉我调试断言失败可以通过各种方式发生。 结果,对于为什么我的代码会显示错误消息,我几乎一无所知。我现在怀疑我的析构函数有问题吗? 非常感谢您的提前帮助!

问题是因为您要显式调用析构函数:

u1.Update::~Update();

这样,它被两次调用导致不确定的行为,我想删除[]日期; 被两次调用,第二次是在已释放的内存上。

代码中的另一个问题是您正在为数组使用裸指针:

int * date;

这实际上是C ++的底层编程风格,可能会导致很多问题。 您应该实现类复制构造函数和赋值运算符(*),该类将在复制Update类时分配新的日期数组,否则您将再次遇到删除多个日期指针的问题。

最好的方法是使用像矢量

std::vector<int> date;

(*)我认为很好的链接在这里解释了适用于此处的三个规则(或自C ++ 11的五个规则): 三分法则成为C ++ 11的五分法?

您应该更改此行:
date [0] =日,date [1] =月,date [2] =年;

至:

date[0] = day;
date[1] = month;
date[2] = year;

您正在使用逗号运算符 ,该运算符返回最后一个表达式的结果。 这与逗号在初始化中的操作方式不同。

同样,在您的main函数中,您无需显式调用析构函数。

您的日期方法无法处理1月31日或12月31日。

您可以直接访问函数的参数,而不必在函数中进行复制。 例如: day = D; 不需要; 直接访问参数: if ((D < 1) ...

如果使用无符号整数,则无需检查负数。 我从未经历过消极的日子,月份或年份。

由于这是C ++,而不是Java或C#,因此不需要动态分配变量。 因此,可以使用int date[3]而不是使用int * date

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM