人类迷惑问题(误)?浅拷贝的相关问题...为什么同样的代码运行结果不一样

Kidca 2020-05-22 03:21:37
今天有朋友问我题的时候,出现了一个迷惑情况,就是同样的代码,在我这能跑,在ta那就会崩。
之后发现是浅拷贝的相关问题,出问题的相关代码如下:
#include <iostream>
struct Node{
int data;
struct Node *next;
};
int main() {
Node * p = new Node;
Node *q = new Node ;
q = p;
free(p);
free(q);
return 0;
}

q=p应该是浅拷贝,即q与p指向的是同一块内存。

如果free(p)再执行free(q),因为q的内存已经被free了再free按理来说应该会报错。

而在朋友的电脑上执行确实会报错,在我这里就是正常结束(无error,return 0)??

求问大佬这可能是什么原因呢?
...全文
195 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
棉猴 2020-05-23
  • 打赏
  • 举报
回复
首先你的代码在VS2015 C++环境下是报错的; 其次,就像楼上朋友说的,new一定要对应delete,改成delete依旧报错,原因就是q和p指向同一块内存。
qybao 2020-05-22
  • 打赏
  • 举报
回复
这跟浅拷贝深拷贝没关系吧,是对同一块内存释放了两次 可以参考以下帖子,看看free的源码 https://www.cnblogs.com/hanyonglu/archive/2011/04/28/2031271.html 申请内存时是附带另外的内存管理信息内存空间的,释放时管理信息内存空间也一起修改释放了,再释放就会再次修改这块管理信息内存空间(这块空间第一次释放就已经属于垃圾内存了,所以修改它可能会造成冲突) 另外,你的申请释放内存的函数也不规范,new对delete,malloc对free,窜着使用也会带来问题
Simple-Soft 2020-05-22
  • 打赏
  • 举报
回复
double free如果是在debug版模式下,一般会崩溃,因为debug版在内存分配的时候会附加一些信息,但是在release版,则不一定会崩溃,跟有些编译器的处理方式可能也有关系,所以release版本的错误有时候很难找,而且不能稳定重现

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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