社区
C++ 语言
帖子详情
200分求讨论:如何保证传入的指针生命周期不是栈上的?
lsldd
博客专家认证
2011-08-28 08:36:58
现要设计一个函数void Fun(SomeStruct* pData)
该函数内部可能会对该指针做delete操作。如果该指针所指一个栈上内容,可能会导致崩溃。
现在的问题是如何保证传入的这个指针指向内容为堆上的或者全局的,而不是栈上的呢?
欢迎各路英雄讨论!
不限思路,可在C++语法、面向对象、设计模式、编译器等各种角度来进行探讨!
有价值的回帖一律散分!
...全文
506
54
打赏
收藏
200分求讨论:如何保证传入的指针生命周期不是栈上的?
现要设计一个函数void Fun(SomeStruct* pData) 该函数内部可能会对该指针做delete操作。如果该指针所指一个栈上内容,可能会导致崩溃。 现在的问题是如何保证传入的这个指针指向内容为堆上的或者全局的,而不是栈上的呢? 欢迎各路英雄讨论! 不限思路,可在C++语法、面向对象、设计模式、编译器等各种角度来进行探讨! 有价值的回帖一律散分!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
指针在内部被其他调用了么,谁申请谁释放,或者被哪个换了就释放哪个~ 不仔细肯定出错
珍惜生命远离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也会死机...
加载更多回复(34)
C++开发基础理解std::string 对象的
生命周期
,避免悬空
指针
或内存访问错误
避免悬空
指针
或内存访问错误。在处理字符串转换时,始终牢记确保数据的有效性和一致性是非常重要的。
C++ 11 学习总结——智能
指针
对于编译器来说,智能
指针
实际上是一个栈对象,并非
指针
类型,在栈对象生命期即将结束时,智能
指针
通过析构函数释放有它管理的堆内存。 什么是RAII技术? RAII技术即资源分配及初始化,使用类来封装资源的分配和...
用lambda+智能
指针
方式作为async_wait回调参数来延长参数
生命周期
及lambda本质(C++asio网络库相关)
传入
引用就是引用本身的
生命周期
不用绑定原生
指针
可以通过在lambda绑定智能
指针
来延长
生命周期
但有的时候并不希望事件回调参数有如此长的
生命周期
希望外部来控制 还有一个弊端也改变了外部函数接口,...
Rust语法:所有权&引用&
生命周期
所以此时Rust要求你对
传入
的参数的引用的
生命周期
加以限定,以
保证
返回值的
生命周期
是可以被Rust编译器推断的(没错,
生命周期
标注就是为了告诉Rust编译器你的返回值的
生命周期
是多大,从而让Rust能够检查出潜在的...
【C++多线程编程】 线程安全与对象
生命周期
管理
多线程下线程安全与对象
生命周期
管理,bind 、 shared_ptr 、 weak_ptr三者结合实现方法
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章