临时变量浅拷贝后理应导致非法访问内存,却在CB上跑出答案,求解!

yuhong_liu 2015-06-12 12:08:44

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <vector>
using namespace std;

class class_int
{
public:

class_int()
{
t=new int [10];
}
~class_int()
{
delete [] t;
}
int *t;
};

class_int test()
{
class_int tmp;
tmp.t[1]=555;
return tmp;
}

int main()
{
class_int t6=test(); //此处按照我的 理解是 浅拷贝 因为 我没有写 拷贝构造函数
cout<<t6.t[1]; // 由于是浅拷贝,t6中的 t指针必然指向tmp中的数据内存,然而tmp作为临时变量,在上一句已经析构了
return 0; //因此输出应该是非法内存,但是VC中认为是非法内存,CB却认为是正常并且输出了555
}





个人非常不理解 为什么 在 CB上能输出 理论上应该是已经delete了的内存 。
...全文
127 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤奋的小游侠 2015-06-12
  • 打赏
  • 举报
回复
delete只是告诉操作系统:这块内存你可以收回去了。 操作系统将内存收回去后用来干嘛了,谁也不知道。 这个指针称之为野指针。 访问一个野指针会有什么后果?答案是未定义的。有可能你运气好,访问的刚好是上次残留的数值,要是你运气不好,程序直接就挂掉了。 像你这种只是简单的几行代码,delete掉系统也不会重用这块内存,基本上很难碰到问题。 vc 的debug版本的内存会有一个额外的调试块,所以会报错,如果你是用release来编译的话,vc估计也检查不出问题。
fly_dragon_fly 2015-06-12
  • 打赏
  • 举报
回复
返回值优化造成吧, CB是指Code::Blocks还是C++Builder, 如果是gcc, class_int t6=test();在整个调用过程只调用一次构造函数, 如果是VC, 有两次, 会导致指针无效
pengzhixi 2015-06-12
  • 打赏
  • 举报
回复
delete [] t; t=NULL; 这样再试试
fly_dragon_fly 2015-06-12
  • 打赏
  • 举报
回复
引用 5 楼 viphong 的回复:
[quote=引用 2 楼 fly_dragon_fly 的回复:] 返回值优化造成吧, CB是指Code::Blocks还是C++Builder, 如果是gcc, class_int t6=test();在整个调用过程只调用一次构造函数, 如果是VC, 有两次, 会导致指针无效
是CODEBLOCK,,私以为,class_int t6=test(); 首先在test()函数 返回的时候 会构造无名class_int 类型的临时变量 把tmp的内容复制到该无名临时变量,然后 赋值给t6,然后就 tmp和该无名临时变量都会析构。 由于我没写拷贝构造函数,所以 全部都是浅拷贝,因此 t6里面的指针指向的是已经被delete的内存,,, VC和CB应该都是一样的啊在这个过程里[/quote]返回值优化的意思就是不会产生临时变量, 是gcc吧,加上-fno-elide-constructors再试一下
yuhong_liu 2015-06-12
  • 打赏
  • 举报
回复
仔细单步后发现 VC 在 class_int t6=test(); 后 会把 临时变量delete掉,从而释放了那块内存,,而CB中 并不对那个内存delete。 从而 还能输出555 我判断有无delete 是在析构函数中加入了输出语句 cout<<t[1]<<"delete"<<endl;
yuhong_liu 2015-06-12
  • 打赏
  • 举报
回复
引用 1 楼 pengzhixi 的回复:
delete [] t; t=NULL; 这样再试试
也不行
lin5161678 2015-06-12
  • 打赏
  • 举报
回复
野指针是未定义行为 未定义行为不保证结果 不保证结果是正确的 也不保证结果是错误的 出现什么情况都是正常的
yuhong_liu 2015-06-12
  • 打赏
  • 举报
回复
引用 2 楼 fly_dragon_fly 的回复:
返回值优化造成吧, CB是指Code::Blocks还是C++Builder, 如果是gcc, class_int t6=test();在整个调用过程只调用一次构造函数, 如果是VC, 有两次, 会导致指针无效
是CODEBLOCK,,私以为,class_int t6=test(); 首先在test()函数 返回的时候 会构造无名class_int 类型的临时变量 把tmp的内容复制到该无名临时变量,然后 赋值给t6,然后就 tmp和该无名临时变量都会析构。 由于我没写拷贝构造函数,所以 全部都是浅拷贝,因此 t6里面的指针指向的是已经被delete的内存,,, VC和CB应该都是一样的啊在这个过程里
yuhong_liu 2015-06-12
  • 打赏
  • 举报
回复
引用 3 楼 lovesmiles 的回复:
delete只是告诉操作系统:这块内存你可以收回去了。 操作系统将内存收回去后用来干嘛了,谁也不知道。 这个指针称之为野指针。 访问一个野指针会有什么后果?答案是未定义的。有可能你运气好,访问的刚好是上次残留的数值,要是你运气不好,程序直接就挂掉了。 像你这种只是简单的几行代码,delete掉系统也不会重用这块内存,基本上很难碰到问题。 vc 的debug版本的内存会有一个额外的调试块,所以会报错,如果你是用release来编译的话,vc估计也检查不出问题。
但是 。。我认为 delete的功能 只是释放 ,这样 系统效率比较高。。。但是 VC里面 显然是对这块空间 做了什么 再次访问的时候全变成了随机数,,,而 CB和我们学校的OJ都 没有填掉那个空间,因此 能访问出555。。。。。
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

64,648

社区成员

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

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