【发布时间】:2019-10-30 19:01:25
【问题描述】:
运行程序后,我收到一条错误消息,提示 projectname 已触发断点。我仍然不知道错误是什么。我认为缺少一个成员函数,但有人帮我吗?
#include "AClass.h"
#include <iostream>
using namespace std;
int main()
{
AClass* x = new AClass(10, -1.0);
AClass y = *x;
delete x;
return 0;
}
我的 cpp 文件中的代码如下:
#include "AClass.h"
#include <iostream>
using namespace std;
// Constructor
AClass::AClass(int len, double val)
: length(len)
{
if (len < 0) {
cout << "Invalid data length = " << len << endl;
data = NULL;
}
else {
data = new double[length];
for (int i = 0; i < length; i++)
data[i] = val;
}
}
// Destructor
AClass::~AClass()
{
// delete data if it is not NULL
if (data) delete[] data;
}
【问题讨论】:
-
触发断点听起来不像是错误;您是如何得知此事的?
-
看起来您有 Rule of Three 违规行为。需要minimal reproducible example 进行确认。
-
当你的程序做了一些真正扰乱系统并导致崩溃的事情时,也会触发断点。调试器在崩溃现场停止并允许您执行事后分析。违反三规则的后果通常是崩溃。,
-
您的代码上的随机 cmets:1)
data = NULL;- 否。请在新代码中使用nullptr(并更新旧代码)。 2)if (data) delete[] data;- 不。那个条件完全没有意义,delete[]()可以处理通过nullptr,这是一个空操作。摆脱毫无意义的if。 3) 你为什么要在 2019 年编写的 C++ 代码中进行手动内存管理,但没有实现容器或类似的内容?使用std::array、std::vector或其他适当的容器,或者至少使用智能指针 - 裸露的new/delete是一种代码味道。 -
我仍然不知道错误是什么。 -- 在你的析构函数中放置一个断点。观察相同的指针值
data被删除两次。双重删除错误,崩溃。
标签: c++ visual-studio member-functions