200分求讨论:如何保证传入的指针生命周期不是栈上的?

lsldd 2011-08-28 08:36:58
现要设计一个函数void Fun(SomeStruct* pData)
该函数内部可能会对该指针做delete操作。如果该指针所指一个栈上内容,可能会导致崩溃。
现在的问题是如何保证传入的这个指针指向内容为堆上的或者全局的,而不是栈上的呢?

欢迎各路英雄讨论!
不限思路,可在C++语法、面向对象、设计模式、编译器等各种角度来进行探讨!
有价值的回帖一律散分!
...全文
413 点赞 收藏 54
写回复
54 条回复
majia2011 2011年10月24日
ms知道是不是堆,你可以学习一下,很简单的判下堆头
回复 点赞
RamonJin 2011年10月24日
改一下设计,用智能指针即可。

或者用C++沉思录中的中间层的办法,弄一个代理。

代理维护一个真正对象的引用计数。这样不需要传指针,直接传一个代理的对象拷贝即可。

当引用计数为0的时候,代理负责delete真正的对象。
回复 点赞
cocoabird 2011年10月24日
1,用智能指针shared_ptr或者auto_ptr管理对象
2,用资源管理器
可以避免此类问题
回复 点赞
zpclxc 2011年10月24日
学习了~~~
回复 点赞
lsldd 2011年10月24日
谢谢大家的讨论!
其实有没有结果无所谓,毕竟只是个纯理论的探讨而已。
结贴,散分。
回复 点赞
DX_deepblue 2011年08月30日
删除钱判断不是为空就delete
回复 点赞
DX_deepblue 2011年08月30日
删除以前if(P!= NULL)写一下
回复 点赞
DX_deepblue 2011年08月30日
指针在内部被其他调用了么,谁申请谁释放,或者被哪个换了就释放哪个~ 不仔细肯定出错
回复 点赞
珍惜生命远离CPP 2011年08月30日
得到当前的栈大小和起始位置,删除前判断一下就可以了。
回复 点赞
blh 2011年08月30日
如果你要进行delete,那么你只要保证SomeStruct的对象必须通过new创建就行了,如17楼的方式
如果用其他方式,需要考虑3中情况,栈,堆(通过new/malloc),和全局数据区(就是全局变量定义的地方)
回复 点赞
nightkids_008 2011年08月30日
用智能指针模式来做么 就不会有泄露的问题了
回复 点赞
君恪 2011年08月30日
路过,最近准备重拾C++
回复 点赞
尘缘udbwcso 2011年08月30日
我是来学习的
回复 点赞
gykgod 2011年08月30日
[Quote=引用 40 楼 luuillu 的回复:]
C/C++ code

class A
{
private:
A* operator& ();
};
[/Quote]
++
禁止了取地址操作
回复 点赞
iamnobody 2011年08月29日
试试吧,应该是这样的
回复 点赞
iamnobody 2011年08月29日
在主函数上定义2个变量
char a;
char* p = &a;

在void Fun(SomeStruct* pData) 内定义一个变量 char b;

如果 pData 的地址不在 &b 和 &a 之间,那么,不在栈内。前提是,pData 指向的地址有效
程序没错。


回复 点赞
luuillu 2011年08月29日

class A
{
private:
A* operator& ();
};
回复 点赞
一叶之舟 2011年08月29日
这是想办法犯错误。
回复 点赞
5t4rk 2011年08月29日
为什么非要这样呢

讨论下来

项目中的代码会这样写吗

回复 点赞
hacqing 2011年08月29日

对于全局或者是静态变量,我表示delete也会死机...
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告