高难问题:如何判断一个指针的内存是否已经释放?

ljc1007 2003-07-25 08:46:17
给指针分配了空间,多个进程对其进行了操作,随后要释放,如何能知道该内存是否已经释放,避免多次释放?
或,分配100字节的内存,能否只释放其中的50字节?
这问题困扰了我很长时间,不知哪位大侠知道如何解决。
必高分酬谢。
...全文
1448 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
暗黑帝国 2003-07-26
  • 打赏
  • 举报
回复
我同意楼上的!我曾使用过这种方法!必须重新new出来!
LionTang 2003-07-26
  • 打赏
  • 举报
回复 1
titi_lima(李马) 兄所言,小生不敢苟同。
使用delete时,当然要检验对象是否为零,否则会报出“删除无效指针”的错误的。

还有chucher()兄所言,小生也不敢苟同。
虽然我没读过c++ primer,但是有一点可以肯定,那就是,两个指针指向同一块内存,那它们就是同一个指针。因为指针就是内存地址。我猜chucher()兄是想说两个指针“类型”的变量的内容指向同一块内存。这样的话后面就有问题了。首先使用delete,系统回收的是一块内存,依据的是这块内存的地址,而不是承载这个地址的变量。所以,delete后面跟哪个指针类型的变量无关紧要,这块内存都会被安全释放。只是以后想使用先前的任何一个指针类型的变量都得不到正确的内容。

至于楼主的第二个问题:分配100字节的内存,能否只释放其中的50字节?
这是办不到的,因为系统是依据分配的内存的首地址和长度来管理内存的。据我所知,windows并没有提供给你改变所分配的内存在系统中记录的长度信息的接口。我想这也是windows的一个明智的选择,否则操作系统的内存将变的非常复杂。

我猜楼主是想解决在数组中动态调整大小的问题。如果你想让内存的长度总是和你需要的一致(不多不少),解决的办法是重新分配一块内存,再把以前的数组中你需要的数据复制进去。然后释放以前的内存。这个问题,即使是在mfc的数组类(CArray 等)的内部也是这样来实现。否则链表的优势何在。

slimsymphony 2003-07-26
  • 打赏
  • 举报
回复
titi_lima(李马) 兄:
"如果如诸位所说,每次delete后将指针置空,那么“下次delete 时”,可以直接这么写:
delete p;
p = NULL;
因为使用delete时,无需检验对象是否为零。"
我想你没有看清吧
如上面牛兄所写的
if(pointer!=NULL)
{
delete []pointer;

pointer = NULL; // 在delete之后,指针赋NULL,这是关键。
}
delete []pointer 和delete 要注意欧


chucher 2003-07-25
  • 打赏
  • 举报
回复
当有两个指针指向一个内存区时,一般遵从谁分配谁释放的原则。另外c++提供了一个专门的类来管理这方面问题,具体哪个类我不记得了,c++ primer里有介绍。
muche 2003-07-25
  • 打赏
  • 举报
回复
加上指针检查语句就是了,牛说得很对!
wj59 2003-07-25
  • 打赏
  • 举报
回复
up
25xxx25 2003-07-25
  • 打赏
  • 举报
回复
up
jiajie828 2003-07-25
  • 打赏
  • 举报
回复
记录
titi_lima 2003-07-25
  • 打赏
  • 举报
回复
如果如诸位所说,每次delete后将指针置空,那么“下次delete时”,可以直接这么写:
delete p;
p = NULL;
因为使用delete时,无需检验对象是否为零。
yy23rock 2003-07-25
  • 打赏
  • 举报
回复
判断是否为空呀~!
colorknight 2003-07-25
  • 打赏
  • 举报
回复
PUSER pstruUser[10];

for(int i=0;i<10;i++)
{
pstruUser[i]=new USER;
}
NewFree 2003-07-25
  • 打赏
  • 举报
回复
gz
_liang_ 2003-07-25
  • 打赏
  • 举报
回复
不知怎么判断指针指向内存是否释放,但可以判断某一段代码是否有内存泄露啊
ui_ppoppopp 2003-07-25
  • 打赏
  • 举报
回复
gz, 你应该看看,new and del一个数组和别的有点区别的。
aftravel 2003-07-25
  • 打赏
  • 举报
回复
delete [] pstruUser;
ping_2001 2003-07-25
  • 打赏
  • 举报
回复
楼主
你申请的是一个数组的内存
你在删除的时候却是delete pstruUser,这样是不能保证程序的行为的.
你的思路有问题,
delete [] pstruUser;
ljc1007 2003-07-25
  • 打赏
  • 举报
回复
可能我没把问题说清楚,不如看代码:

typedef struct _tagUser
{
char chUsername[16];
char chPassWord[16];
}USER,*PUSER

CMapStringToPtr cmapNameToPtr;

PUSER pstruUser=new USER[10];

for(int i=0;i<10;i++)
{
CString cstrUserName=(pstruUser+i)->chUserName;
cmapNameToPtr.SetAt(cstrUserName,(void*)(pstruUser+i)
}

然后,在另外一个成员函数中(例如:OnDestroy)

POSITION pos=cmapNameToPtr.GetStartPosition()
CString cstrName;
PUSER pstruUser;
while(NULL!=pos)
{
cmapNameToPtr.GetNextAsso(pos,cstrName,(void*&)pstruUser)
if(NULL!=pstruUser)
{
delete pstruUser;
pstruUserDelete=NULL;
}
}
程序出错,因为pstruUser原来分配的是一段连续的空间10个结构空间,但删除第一个指针时已经把整个空间释放,因此,在释放随后的指针时,就出错。
哪位大侠能解决这个问题,很有挑战性的。
wangweintk 2003-07-25
  • 打赏
  • 举报
回复
同意" dizzo(牛说:别哭,要坚强!) "的意见,他说的已经很详细了,没什么好补充的。
大家都是这么干的,别犹豫了...
slimsymphony 2003-07-25
  • 打赏
  • 举报
回复
delete 只能释放分配的内存空间
对原本的指针不会置空
而将指针释放空间后赋空是必要步骤
因为不这样做的话
该指针会转变为所谓的“野指针”
详细的可以参考 高质量C++/C编程指南 林锐博士著
shootingstars 2003-07-25
  • 打赏
  • 举报
回复
是否delete pointer后pointer==NULL?
我想是不是可以这样解决,每次delete后将pointer赋空,以后每次delete都判断pointer是否为空。
加载更多回复(7)

16,472

社区成员

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

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

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