求助,为什么我在VS调试到析构函数的时候到p=p->next突然触发断点,停止了,一直找不出问题

眺望QAQ 2020-09-11 11:32:28

#include<iostream>
using namespace std;
struct LinkList {
int data;
LinkList* next;
};
class LinkListClass {
LinkList* head;
public:

LinkListClass();
~LinkListClass();
void CreateList(int d);
friend int count(LinkListClass a, LinkListClass b);
};
LinkListClass::LinkListClass() {
head = new LinkList();
head->next = NULL;
}
LinkListClass::~LinkListClass() {
LinkList *pre, *p;
pre = head;
p = pre->next;
while (p) {
delete pre;
pre = p;
p = p->next;
}
delete pre;
}
void LinkListClass::CreateList(int d) {
LinkList* s;
int i,n;
cin >> n;
head->next = NULL;
while (d>0) {
int a;
a = n % 10;
s = new LinkList();
s->data = a;
s->next = head->next;
head->next = s;
n = n / 10;
d--;
}
}
int count(LinkListClass a, LinkListClass b) {
LinkList* s, * r;
int num=0;
s = a.head->next;
r = b.head->next;
while (s != NULL && r != NULL) {
if (s->data == r->data) {
num++;
}
s = s->next;
r = r->next;
}
return num;
}
int main() {
int n;
cin >> n;

for (int i = 0; i < n; i++)
{
LinkListClass a, b;
int c,d;
cin >> d;
a.CreateList(d);
b.CreateList(d);
c = count(a, b);
cout << c<<endl;
}
return 0;
}
...全文
83 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
狐帝 2021-05-07
  • 打赏
  • 举报
回复
你没有为LinkListClass定义拷贝构造函数。在调用count(a, b)时,会为a和b创建两个副本,如果没有自定义拷贝构造函数,编译器会用默认的拷贝构造函数创建a和b的副本,而默认的拷贝构造函数只是执行简单的数据复制,这样a和a的副本的head和head->next就指向了相同的存储区,b和b的副本的head及head->next也指向了同样的存储区。当count函数退出运行时,a和b的副本被释放,导致LinkListClass的析构函数被调用,因此a、b副本中head及其所有子孙节点所指向的存储区会被释放掉。由于a/b及其副本的head和head->next指向了相同的存储区,因此a、b的head和head->next也变成了无效指针,所以当外层循环结束时试图释放a、b对象时,就会导致释放head和head->next错误(也就是delete出错),程序就崩溃了。 解决的办法是把count的两个形参变成对LinkListClass的引用:int count(LinkListClass& a, LinkListClass& b);,或者为LinkListClass定义拷贝构造函数,在拷贝构造函数中为head及其子孙节点分配有效空间。 其实,类对象作为函数形参时,应该使用引用方式更好。类对象以传值方式作为函数形参会很不好处理,比如降低调用效率、需要拷贝构造函数等等。
源代码大师 2021-05-07
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧