出于某种原因,当我在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 :(得分:2)
问题是因为你明确地调用了析构函数:
u1.Update::~Update();
这种方式被调用两次导致未定义的行为,我想删除[]日期;被召唤两次,第二次在alreade上释放记忆。
您的代码中的另一个问题是您正在为数组使用裸指针:
int * date;
这实际上是C ++中相当低级的编程风格,可能会导致很多问题。您应该实现类复制构造函数和赋值运算符(*),它将在复制Update类时分配新的日期数组,否则您将再次遇到多个日期指针删除的问题。
最好的方法是使用像
这样的矢量std::vector<int> date;
(*)我认为这里适用的三条规则(或自C ++ 11规则五)以来的良好链接:Rule-of-Three becomes Rule-of-Five with C++11?
答案 1 :(得分:1)
你应该改变这一行:
date [0] = day,date [1] = month,date [2] = year;
要:
date[0] = day;
date[1] = month;
date[2] = year;
您正在使用逗号运算符,它返回最后一个表达式的结果。这与逗号在初始化中的操作方式不同。
此外,在main
函数中,您不需要显式调用析构函数。
您的约会方法无法处理1月31日或12月31日。
您可以直接访问该功能的参数,而不是在该功能中复制。例如:不需要day = D;
;直接访问参数:if ((D < 1) ...
。
如果使用无符号整数,则无需检查负数。在我的生命中,我从来没有经历过负面的日,月或年。
由于这是C ++而不是Java或C#,因此您无需动态分配变量。因此,您可以使用int * date
而不是int date[3]
。