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

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

欢迎各路英雄讨论!
不限思路,可在C++语法、面向对象、设计模式、编译器等各种角度来进行探讨!
有价值的回帖一律散分!
...全文
502 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
指针在内部被其他调用了么,谁申请谁释放,或者被哪个换了就释放哪个~ 不仔细肯定出错
  • 打赏
  • 举报
回复
得到当前的栈大小和起始位置,删除前判断一下就可以了。
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也会死机...
加载更多回复(34)

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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