如何判断一个指针所指的地址是否有效?

handsomge 2003-06-17 02:37:37
我记录了一个对象的指针,但是这个对象有可能已经被删除了,请问如何判断这个指针所指的地址是否还有效?
...全文
3235 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybco 2003-06-18
  • 打赏
  • 举报
回复
有时候, 正因为已事先知道在p1用户的存活期内,p1一直不会灭,
我干脆就把引用 *p1 传给用户,这样用户也免去了检测指针,
直接就调:

class User
{
public:
User(Worker & worker_) : worker(worker_){}

void doSomething() { worker.process(); } // 直接调

private:
Worker & worker;
}
hyifeng 2003-06-18
  • 打赏
  • 举报
回复
to handsomge (汗衫) :

虽然C++的基本语言不提供这种判断机制,
你应该听说过 Java 和 .Net 环境下,对对象进行引用计数,你不用手动删除对象,自动回收机制会回收没有被引用的对象。
如果C++支持这种机制,你说的问题就可以变通的得到了解决。
是的,Boost库里提供的share_ptr模板就可以对对象进行引用计数,并自动释放不再被引用的对象。

如:
share_ptr<myclass> p1(new myclass);
share_ptr<myclass> p2 = p1;

你可以随意使用p1和p2两个smart pointer,他们会管理你的对象,并在最后一个引用该对象的pointer生命期结束时释放对象。

你的问题可以通过这种变通方法解决。
TopCat 2003-06-18
  • 打赏
  • 举报
回复
你可以试试用boost的share_ptr,应该可以解决很大一部分问题
ybco 2003-06-18
  • 打赏
  • 举报
回复
我说点实际工作中的处理办法吧:
对於以下的情况:
p1 = new obj
p2 = p1

一般已事先知道在p1用户的存活期内,p1一直不会灭,这样,你就可以
用 if( p2 != NULL ). 如果不能保证这一条,那就说明设计有问题,要改。
至少,在p1被灭时,一定要通知或关闭有关用户,即普遍所说的cleanup.

另有一种解决办法是用singleton模式:

class Worker
{
static Worker & instance()
{
static Worker aWorker;
return aWorker;
}
// ....
};

这样,不管在哪儿,每次只要调:Worker::instance() 就能保证得到。
hello_wyq 2003-06-18
  • 打赏
  • 举报
回复
The IsBadWritePtr function verifies that the calling process has write access to the specified range of memory.

BOOL IsBadWritePtr(
LPVOID lp, // memory address
UINT_PTR ucb // size of memory block
);
hello_wyq 2003-06-18
  • 打赏
  • 举报
回复
The IsBadReadPtr function verifies that the calling process has read access to the specified range of memory.

BOOL IsBadReadPtr(
CONST VOID *lp, // memory address
UINT_PTR ucb // size of block
);
The IsBadReadPtr function verifies that the calling process has read access to the specified range of memory.

BOOL IsBadReadPtr(
CONST VOID *lp, // memory address
UINT_PTR ucb // size of block
);
qujianwei 2003-06-18
  • 打赏
  • 举报
回复
通过一个指针删除任何一个对象后,都把这个指针置成NULL。
另外,还没有指向任何对象的指针也把它初始化成NULL。
夭夭 2003-06-18
  • 打赏
  • 举报
回复
同意楼上,不过要改,要做一层外封装,有点像,但不是
xiaoyunet 2003-06-18
  • 打赏
  • 举报
回复
这个问题使用引用计数应该可以解决把。
yzykjh 2003-06-18
  • 打赏
  • 举报
回复
指针if(p==0)没有赋值
foxnt 2003-06-18
  • 打赏
  • 举报
回复
C++的野指针。基本是无法避免的了。
zteliubin 2003-06-17
  • 打赏
  • 举报
回复
这个问题还是一个经验问题了,
如果只是 p = new();
那末
{
delete p;
p = NULL;
}
就可以了,如果p1=p的话。就不好作了,
或者你就只用delete p,程序里面控制一下,应该是可以的。
如果两边都有delete,很危险的。无法判断p1是否合法。
mrzz 2003-06-17
  • 打赏
  • 举报
回复
使用指针前最好先进行读操作,主要检查指定位置的标志是否正确,这样
可以减小使用野指针的危险,因为即使是野指针,读操作一般不会有危害。
当然安全和效率是成反比的,额外的校验工作必然消耗额外的时间,C语言
即高效又危险就是这个原因,更高级的语言编译器帮你加入很多校验代码,
编程安全了,但性能损失,我还是喜欢C/C++,效率第一,安全工作正是考
验程序员的时候,C/C++和汇编程序员是最伟大的程序员!
xcopy 2003-06-17
  • 打赏
  • 举报
回复
无法判断
ghtsao 2003-06-17
  • 打赏
  • 举报
回复
指针有效性的验证是比较难办的,多个指针引用一个内存很难避免这样的情况发生。其实delete这个操作会判断指针的有效性,你可以用F11跟踪进去找到相关的代码。
cxjddd 2003-06-17
  • 打赏
  • 举报
回复
到底还要看你自己。

试试智能指针吧。
zat0994 2003-06-17
  • 打赏
  • 举报
回复
哦,什么是“野指针”啊,奇怪奇怪?
zw741027 2003-06-17
  • 打赏
  • 举报
回复
如果不嫌麻烦,可以对内存区做标记,比如需要申请10字节,自己封装一个函数,实际申请20个字节,然后对20个字节中10个字节填充校验码,然后返回偏移了一定数量(10)的指针作为对外的指针,使用前就可以通过校验判断改指针是否有效。只是这样比较麻烦一点。
robertcarlos 2003-06-17
  • 打赏
  • 举报
回复
小心点,应该可以避免的吧?~
1cs1ak1 2003-06-17
  • 打赏
  • 举报
回复



杜绝“野指针“


加载更多回复(11)

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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