免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ljoo
打印 上一主题 下一主题

C/C++如何判断一个指针有无指向有效空间? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-03-09 14:56 |只看该作者
谢谢westgarden
解决了我一个隐含的问题,我把copy constructor 和 copy assignment operator 搞得比较混.
这句话解决了问题,比较值钱
a copy constructor initializes uninitialized memory, whereas the copy assignment operator must correctly deal with a well-constructed object.
------------------------------------
我是在,copy constructor 中去查this指向的类中的指针是否为NULL结果是谝译器没有给无效指针赋值为NULL,于是我就去delete .结果就挂了,从上面的看来copy constructor中this都是没有初始化的object所以就不用多心去查里面的指针是否为空,
而赋值操作符就应要检查.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2008-03-09 14:59 |只看该作者
所以说这是个错误的问题。

论坛徽章:
0
13 [报告]
发表于 2008-03-09 15:04 |只看该作者
原帖由 flw 于 2008-3-9 14:59 发表
所以说这是个错误的问题。

在我看到这句话前,我并不认为我把copy construcor 和copy assignment operator 弄混了.
所以错误的问题我还是要提的.

论坛徽章:
0
14 [报告]
发表于 2008-03-09 20:47 |只看该作者
正确的做法是lint 检查

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2008-03-09 20:57 |只看该作者
关键为什么要去这么干呢?.......本没理由
真的要干,貌似没统一方法。
linux下去读/proc/self/maps然后判断吧
还有一种方法:
抓SIGSEGV,这或许是所谓的统一方法吧

论坛徽章:
0
16 [报告]
发表于 2008-03-10 13:24 |只看该作者
class base{
public:
   base():p(0)
  {
     printf("%d",p);//<-p point form  0
  }
private:
   int a;
   char *p; //<------------------
};

论坛徽章:
0
17 [报告]
发表于 2008-03-10 13:47 |只看该作者
无解的问题.

你malloc得到空间了, 又free了前一个得到的.

这时候, maps, SEGV都不会发生.



原帖由 cjaizss 于 2008-3-9 20:57 发表
关键为什么要去这么干呢?.......本没理由
真的要干,貌似没统一方法。
linux下去读/proc/self/maps然后判断吧
还有一种方法:
抓SIGSEGV,这或许是所谓的统一方法吧

论坛徽章:
0
18 [报告]
发表于 2008-03-10 14:57 |只看该作者
原帖由 emoxiaozhu 于 2008-3-10 13:24 发表
class base{
public:
   base():p(0)
  {
     printf("%d",p);//


这样感觉是不行的,因为在调用copy constructor时的对像是没有构造完全的,他不会去调用base():p(0)
如果编译器在给对像分配空间就把空间清零会好一些,只是这样效率是不是又低了.
难道操作系统都感觉不到指针指向无效空间,直到程序崩溃?

论坛徽章:
0
19 [报告]
发表于 2008-03-10 21:06 |只看该作者
判断指针是否有效,或指向空间的大小,适用于debug / assert.

1 有些memory manager提供ANSI以外的接口。如Window _CrtIsValidPointer() / _msize(), Linux RH distribution malloc_usable_size()

2 系统Virtual Memory Manger可选择输出进程的address map。如Window VirtualQuery(), Linux /proc/pid/map

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
20 [报告]
发表于 2008-03-10 22:31 |只看该作者
原帖由 思一克 于 2008-3-10 13:47 发表
无解的问题.

你malloc得到空间了, 又free了前一个得到的.

这时候, maps, SEGV都不会发生.




涉及到用户态的数据结构了,那就黔驴技穷了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP