关于指针引用的问题

iwin 2001-07-10 08:14:04
我在其它很多地方都有指向某个对象的指针变量,但是这个对象本身并不知道有谁指向它,所以,在它释放后,其它地方的指针变量在使用前,如何才能判断出它已经释放,而不会出错呢?
...全文
252 点赞 收藏 21
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
vlmf 2001-07-12
c 就上这样的。 你更本就不可能知道你的指针是有效的还是无效的。 这要靠你自己去
把握!
example:
CYourObject * lpYourObject1 = new CYourObject;
CYourOjcet * lpYourObject2 = lpYourObject1;
delete lpYourObject1; // 这时 lpYourObject2 还是指向原来的内存地址 ,编译
//器并不会把 lpYourOjbect2 付值 为 NULL . 所有说 一个指针是不是有效是程序员的
// 事情

回复
michaelzhong 2001-07-12
让对象自行解决自己(内存管理).把对象仍到组件里,再用接口将你和对象分离,你亲吻她的接口(Release())就行了.其实任何对象的问题都能用DLL来解决,而任何DLL的问题都能用COM解决,而任何COM的问题都能用MFC/ATL解决,而MFC/ATL把Release方法都封装好了,其实实现细节和Kevin_qing所说的类似
回复
Kevin_qing 2001-07-12
另外还可以使用callback的方法来通知B/C类,不过实在是比较麻烦,而且也没有什么必要
回复
Kevin_qing 2001-07-12
ok~再来一个方法,可能比较烂 :P
struct A{
....
};

struct B{
B(A* pa){m_rpa=pa;}
protected:
A*& m_rpa;
};

struct C{
C(A* pa){m_rpa=pa;}
protected:
A*& m_rpa;
};
void main()
{
A* pa=new A;
B b(pa);
C c(pa);
delete pa;
pa=NULL;

//b,c可以根据m_rpa的值来判断pa是否有效;
}
回复
david4no 2001-07-12
有一个函数可以试一下!
BOOL AfxIsValidAddress( const void* lp, UINT nBytes, BOOL bReadWrite = TRUE );
第一个值是你的指针!第二个是对象的大小!第三个是说明你要判断这块的地址是可读写(TRUE〕的还是只读的(FASLE〕;
SDK中也有类似的函数如
BOOL IsBadCodePtr(
FARPROC lpfn // address of function
);
BOOL IsBadReadPtr(
CONST VOID *lp, // address of memory block
UINT ucb // size of block
);

BOOL IsBadStringPtr(
LPCTSTR lpsz, // address of string
UINT ucchMax // maximum size of string
);
BOOL IsBadWritePtr(
LPVOID lp, // address of memory block
UINT ucb // size of block
);



回复
n6002 2001-07-12
这里有一篇文章,非常有帮助,希望大家都来看看
《C++ Without Memory Errors》by Dejan Jelović
http://www.jelovic.com/articles/cpp_without_memory_errors_slides.htm
其中有个工具,就叫工具吧,很多时候都可以使用,这可是秘密武器。
回复
iwin 2001-07-12
to Kevin:
你的方法类似于COM的引用计数的方法,这种方法在有被引用的情况下对象不能释放。

我想找一种方法:当class A的对象自己释放时,不用遍历引用自己的对象,而引用它的对象又能够判断它已被释放的简单方法。
回复
PioneerMan 2001-07-11
当你释放class A时,把pB_A=NULL; pC_A=NULL;在用pB_A,和pC_A时先判断是否为空
回复
不解 2001-07-11
这与你定义变量的位置有关,如果为局部的,根本无须考虑;如果是全局的,则同楼上两位的意见。
回复
dongyingtao 2001-07-11
你释放B、C的实例时要么释放其中的A类型指针指向的对象,要么从A类型对象的链表中去掉自己不就行了吗
回复
wyzegg 2001-07-11
只判断一下是否为空就行
回复
iwin 2001-07-11
to z_sky:
如果我在class A 里加个链表记住都有谁指向自己,当释放class A时,将链表中的指针都恢复为空。但是,如果class B或class C先释放呢?
回复
z_sky 2001-07-11
不要钻牛角了,一定要自己记住,要么用程序代码记;
方式很多,要么用全局变量、要么再class A 里加个链表记住都有谁指向自己了。
回复
iwin 2001-07-11
up
回复
iwin 2001-07-11
有人知道怎样做吗?
回复
Kevin_qing 2001-07-11
其实写到最后看起来就好像是COM了,不过没有研究过COM,不知道是不是就是这么回事
回复
iwin 2001-07-11
是这样的:

class A
{
....
};

class B
{
A *pB_A;
....
};

class C
{
A *pC_A;
....
};

.........

如何对pB_A和pC_A进行判断?(假设在此之前以对pB_A和pC_A赋值,然后单独释放了它们所指向的对象)

回复
flagfly 2001-07-11
kevin发言了
回复
Kevin_qing 2001-07-11
看代码:

struct c{
C(){nRef=1;};
int AddRef(){
return ++nRef;
}
int Release(){
if(!--nRef)
{
 delete this;
 return 0;
}
return nRef;
}
protected:
virtual~c()//donot allow delete from outsides
{

}
int nRef;

};


struct a{
a(c* pc)
{
m_pc=pc;
pc->AddRef();
}

void do_Sth(){
;//...使用完成m_pc了
m_pc->Release();
m_pv=NULL;
}

protected:
c* m_pc;
}
class b的结构和a也差不多,就不写了
下面是main函数:
void main()
{
c* pc=new c;
a clsA(pc);
b clsB(pc);
pc->Release();//ok pc was hold by both clsA and clsB,so we don't need it.release.
pc=NULL;
a.do_sth();
b.do_sth();

;//should no memory leak
}


这个方面的问题我专门写了一篇文章,过几天放上来。
回复
nustchen 2001-07-11
你这用的是对象局部实例,相互没有关联。
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-07-10 08:14
社区公告

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