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

Kidca 2020-05-22 03:14:01
今天有朋友问我题的时候,出现了一个迷惑情况,就是同样的代码,在我这能跑,在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)??

求问大佬这可能是什么原因呢?
...全文
189 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
Kidca 2020-05-22
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错的回复:
free C 动态内存管理 定义于头文件 <stdlib.h> void free( void* ptr ); 解分配之前由 malloc() 、 calloc() 、 aligned_alloc (C11 起) 或 realloc() 分配的空间。 若 ptr 为空指针,则函数不进行操作。 若 ptr 的值不等于之前从 malloc() 、 calloc() 、 realloc() 或 aligned_alloc() (C11 起) 返回的值,则行为未定义。 若 ptr 所指代的内存区域已经被解分配,则行为未定义,即是说已经以ptr 为参数调用 free() 或 realloc() ,而且没有后继的 malloc() 、 calloc() 或 realloc() 调用以 ptr 为结果。 若在 free() 返回后通过指针 ptr 访问内存,则行为未定义(除非另一个分配函数恰好返回等于 ptr 的值)。 free 是线程安全的:它表现得如同只访问通过其参数可见的内存区域,而非任何静态存储。 令 free 解分配内存区域的调用,同步于任何令分配函数分配相同或部分相同区域的后续调用。这种同步出现于任何解分配函数所做的内存访问后,和任何分配函数所做的内存访问前。所有操作每块特定内存区域的分配及解分配函数拥有单独全序。
感谢!这应该确实是由于未定义各个编译器处理不同造成的
真相重于对错 2020-05-22
  • 打赏
  • 举报
回复
对一个指针重复free属于标准未定义行为,具体看编译器如何规定。
真相重于对错 2020-05-22
  • 打赏
  • 举报
回复
free C 动态内存管理 定义于头文件 <stdlib.h> void free( void* ptr ); 解分配之前由 malloc() 、 calloc() 、 aligned_alloc (C11 起) 或 realloc() 分配的空间。 若 ptr 为空指针,则函数不进行操作。 若 ptr 的值不等于之前从 malloc() 、 calloc() 、 realloc() 或 aligned_alloc() (C11 起) 返回的值,则行为未定义。 若 ptr 所指代的内存区域已经被解分配,则行为未定义,即是说已经以ptr 为参数调用 free() 或 realloc() ,而且没有后继的 malloc() 、 calloc() 或 realloc() 调用以 ptr 为结果。 若在 free() 返回后通过指针 ptr 访问内存,则行为未定义(除非另一个分配函数恰好返回等于 ptr 的值)。 free 是线程安全的:它表现得如同只访问通过其参数可见的内存区域,而非任何静态存储。 令 free 解分配内存区域的调用,同步于任何令分配函数分配相同或部分相同区域的后续调用。这种同步出现于任何解分配函数所做的内存访问后,和任何分配函数所做的内存访问前。所有操作每块特定内存区域的分配及解分配函数拥有单独全序。
  • 打赏
  • 举报
回复
跟编译器无关,*((char*)rand()) = '1' 这句都不一定会引起崩溃。但可能会引起其他潜在的问题,因为修改了其他地方的内存
Kidca 2020-05-22
  • 打赏
  • 举报
回复
引用 2 楼 春天到了冬天还远吗 的回复:
无运行错误不代表程序没问题,有一定概率的
真实运行环境中有可能会导致其他地方崩溃,我以前遇到过,很难找

我这里确实是觉得程序是有问题的,是疑惑为什么没有导致崩溃或者错误,这会是编译器的问题吗?
Kidca 2020-05-22
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错 的回复:
先说一下,对是NULL的指针free,不会出错。
所以你的环境是否free(p)之后,把P改写为null?
如果是这样,不会出错。

感谢1楼的回复
刚刚去试了试 发现在free了之后并不为NULL...
  • 打赏
  • 举报
回复
无运行错误不代表程序没问题,有一定概率的 真实运行环境中有可能会导致其他地方崩溃,我以前遇到过,很难找
真相重于对错 2020-05-22
  • 打赏
  • 举报
回复
先说一下,对是NULL的指针free,不会出错。 所以你的环境是否free(p)之后,把P改写为null? 如果是这样,不会出错。

65,184

社区成员

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

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