最基本的问题:如何判断指针的有效性.

mingbao 2004-07-15 10:11:23

我创建了一个指针,还没有为它初始化,也就是说还没有用 new 操作给它动态分配任何空间. 但我发现此时指针的值并不为NULL,也就是不为0;

另外好多人都喜欢先判断指针值是否为NULL, 然后再进行 delete 操作.
可我发现对指针 delete 操作之后, 指针的值仍然不为NULL.

请问我应该如何判断指针的有效性

另外,句柄也有同样的问题!
...全文
208 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pomelowu 2004-07-15
  • 打赏
  • 举报
回复
申明了一个指针之后,系统分配给指针的内容是不确定的,一般都不会是NULL,所以一般申明指针时都要明确把它初始化为NULL:
classname * ptr = NULL;
在new的时候再把这个指针指向new出来的空间:
ptr = new classname();

在指针指向一个new出来的地址后,除非你手动改变,它的值是不变的,即使这块内存被delete了。空间已经不合法,但是它仍然指向这个地址,所以一般的做法也是:
delete ptr;
ptr = NULL;

好像在加入/GZ编译选项以后在release版中会被置NULL,不过你也应该做上面的事情。做了上面的事,就很容易判断指针的有效性了:
if (ptr)
{
....
}
lixiaosan 2004-07-15
  • 打赏
  • 举报
回复
CXXX *p;


delete p;
p = NULL;

或者你可以检查
ASSERT(p != NULL);
needways 2004-07-15
  • 打赏
  • 举报
回复
IsBadCodePtr
kvls 2004-07-15
  • 打赏
  • 举报
回复
1、声明一个指针是请立刻初始化为NULL,如果是一个类的成员变量,请在构造函数里初始化
2、delete只是删除你new的内存,并不给你的指针赋NULL值,所以delete后请也给你的指针赋NULL

PS:养成毫的编程习惯
快乐鹦鹉 2004-07-15
  • 打赏
  • 举报
回复
delete 是不会让指针变为0的。只是告诉系统,这块空间可以自由分配了。因此,我们在delete 后,如果马上用这个指针进行操作,还是没有问题的。因为这块地址还没有被别的进程之类的使用。因此,好的编程方法是在delete 后,马上将指针赋值为NULL,彻底切断指针与这块地址的联系,否则可能会带来危险。这也就是为什么很多书上提示我们,定义变量后要初始化。特别是指针。如果delete 后不赋值为NULL,是没有办法判断的,这也就是野指针的由来。
bohut 2004-07-15
  • 打赏
  • 举报
回复
我的new
char *pBuf = new char[1024];
if(pBuf == NULL)
return ERR;
我的delete
if(pBuf)
{
delete pBuf;
pBuf = NULL;
}
bager 2004-07-15
  • 打赏
  • 举报
回复
可以使用IsBadWritePtr API判断,如下。

char *pBuf;
BOOL bRet = IsBadWritePtr(pBuf,1);
ASSERT(bRet != 0);

pBuf= new char[64];

bRet = IsBadWritePtr(pBuf,1);
ASSERT(bRet == 0);

delete pBuf;
pBuf = NULL;

编程应尽可能的规范,避免楼上各位所说的问题(变量未初始化、野指针)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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