社区
C++ 语言
帖子详情
200分求讨论:如何保证传入的指针生命周期不是栈上的?
lsldd
博客专家认证
2011-08-28 08:36:58
现要设计一个函数void Fun(SomeStruct* pData)
该函数内部可能会对该指针做delete操作。如果该指针所指一个栈上内容,可能会导致崩溃。
现在的问题是如何保证传入的这个指针指向内容为堆上的或者全局的,而不是栈上的呢?
欢迎各路英雄讨论!
不限思路,可在C++语法、面向对象、设计模式、编译器等各种角度来进行探讨!
有价值的回帖一律散分!
...全文
502
54
打赏
收藏
200分求讨论:如何保证传入的指针生命周期不是栈上的?
现要设计一个函数void Fun(SomeStruct* pData) 该函数内部可能会对该指针做delete操作。如果该指针所指一个栈上内容,可能会导致崩溃。 现在的问题是如何保证传入的这个指针指向内容为堆上的或者全局的,而不是栈上的呢? 欢迎各路英雄讨论! 不限思路,可在C++语法、面向对象、设计模式、编译器等各种角度来进行探讨! 有价值的回帖一律散分!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
手写TomCat服务器
我们很多时候都想知道Web容器Tomcat是如何工作的?... 通过手写Tomcat服务器,让学员了解服务器的底层代码,方便学员后期的深入学习,而不是停留在表面API的调用层面。 课程讲义截图:
用lambda+智能
指针
方式作为async_wait回调参数来延长参数
生命周期
及lambda本质(C++asio网络库相关)
lambda函数本质: 遵循了类的特征,
生命周期
和类是一样的 如果有参数
传入
好比类的成员变量
传入
引用就是引用本身的
生命周期
不用绑定原生
指针
可以通过在lambda绑定智能
指针
来延长
生命周期
但有的时候并不希望事件回调参数有如此长的
生命周期
希望外部来控制 还有一个弊端也改变了外部函数接口,上面例子必须要
传入
智能
指针
。。 智能
指针
有传染性,一个地方要用智能
指针
,很多地方都被迫用智能
指针
...
超详细vue
生命周期
解析(详解)
vue是每一个前端开发人员都绕不过的一个技术,在国内的市场占有量也是非常的大,我们大部分人用着vue, 却不知道他内部其实经历了一些什么。每个
生命周期
又是什么时候开始执行的。我们今天来详细的看一看 首先,
生命周期
是个啥? 借用官网的一句话就是:每一个vue实例从创建到销毁的过程,就是这个vue实例的
生命周期
。在这个过程中,他经历了从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程。那么这些过程中,具体vue做了些啥,我们今天来了解一下。 语述 了解之前,我们先贴上一张官网的.
Rust语法:所有权&引用&
生命周期
所以此时Rust要求你对
传入
的参数的引用的
生命周期
加以限定,以
保证
返回值的
生命周期
是可以被Rust编译器推断的(没错,
生命周期
标注就是为了告诉Rust编译器你的返回值的
生命周期
是多大,从而让Rust能够检查出潜在的悬空
指针
错误))是固定的,在编译时就已经确定的了。于是Rust推断出了返回值引用的
生命周期
,这是因为返回值的
生命周期
只可能来自于输入,因为函数内部的创建的对象,在返回引用时会造成悬垂引用(因为函数一结束,被引用的对象就失效了)。一个大的
生命周期
的变量借用了一个小的,所以才会导致了错误的发生。
Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
转载请注明出处: http://kyang.cc/ 栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。根据栈的特点,很容易的想到可以利用数组,来实现这种数据结构。但是本文
C++ 语言
64,643
社区成员
250,606
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章