社区
C语言
帖子详情
请问如何安全的使用指针?拜谢!
ranman
2003-01-08 11:19:52
我在程序中定义的几个指针,在程序运行的时候出现了非法操作。我知道这都是指针惹的祸。
请问该如何安全的使用指针呢?
...全文
65
5
打赏
收藏
请问如何安全的使用指针?拜谢!
我在程序中定义的几个指针,在程序运行的时候出现了非法操作。我知道这都是指针惹的祸。 请问该如何安全的使用指针呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
alan118
2003-01-08
打赏
举报
回复
我觉得最主要的是要保证指针被正确初始化,并且被正确的销毁,不过早,也不过晚
mastercy
2003-01-08
打赏
举报
回复
要保证指针使用以前要初始化
最后要清理不用的指针
Windmoon_hz
2003-01-08
打赏
举报
回复
这个主要凭感觉了
每次用指针指向的地方的时候必须保证指针不是空的。
象链表这种,在添加一个节点后,在节点的next不要忘了赋成null
总之,在编程时用到了,就要想到各种情况,他会不会变成不合法的地址
web_spider
2003-01-08
打赏
举报
回复
用安全类型指针auto_ptr吧。一下是vc6在memory文件中对auto_ptr的定义。研究一下就可以用了。
template<class _Ty>
class auto_ptr {
public:
typedef _Ty element_type;
explicit auto_ptr(_Ty *_P = 0) _THROW0()
: _Owns(_P != 0), _Ptr(_P) {}
auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
: _Owns(_Y._Owns), _Ptr(_Y.release()) {}
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
{if (this != &_Y)
{if (_Ptr != _Y.get())
{if (_Owns)
delete _Ptr;
_Owns = _Y._Owns; }
else if (_Y._Owns)
_Owns = true;
_Ptr = _Y.release(); }
return (*this); }
~auto_ptr()
{if (_Owns)
delete _Ptr; }
_Ty& operator*() const _THROW0()
{return (*get()); }
_Ty *operator->() const _THROW0()
{return (get()); }
_Ty *get() const _THROW0()
{return (_Ptr); }
_Ty *release() const _THROW0()
{((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr); }
private:
bool _Owns;
_Ty *_Ptr;
};
qing_li73
2003-01-08
打赏
举报
回复
Just paste a snippet from "高质量C++/C 编程指南" by Doctor Linrui
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。
常见的内存错误及其对策如下:
内存分配未成功,却使用了它。
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p 是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。
内存分配虽然成功,但是尚未初始化就引用它。
犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。
内存分配成功并且已经初始化,但操作越过了内存的边界。
例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for 循环语句中,循环次数很容易搞错,导致数组操作越界。
忘记了释放内存,造成内存泄露。
含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。
动态内存的申请与释放必须配对,程序中malloc 与free 的使用次数一定要相同,否则肯定有错误(new/delete 同理)。
释放了内存却继续使用它。
有三种情况:
(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。
(2)函数的return 语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
(3)使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。
杜绝“野指针”
“野指针”不是NULL 指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if 语句很容易判断。但是“野指针”是很危险的,if 语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL 指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);
(2)指针p 被free 或者delete 之后,没有置为NULL,让人误以为p 是个合法的指针。
(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,
C++面试八股文:什么是智能
指针
?
二师兄:Foo中有一个智能
指针
指向Goo,而Goo中也有一根智能
指针
指向Foo,这就是循环引用,我们可以
使用
weak_ptr来解决这个文通。二师兄:智能
指针
是C++11引入的类模板,用于管理资源,行为类似于
指针
,但不需要手动...
java程序运行时对象是怎么进行放置安排? 内存是如何分配的呢?
java程序运行时对象是怎么进行放置安排?... 位于通用的RAM(随机访问存储器)中,但是通过堆栈
指针
可以从处理器哪里获取直接的支持。 若堆栈
指针
向下移动,则分配新的内存;若向上移动,则释放哪
漏洞分析丨HEVD-0x5.NullPointerDereference[win7x86]
视频制作不易,求三联支持,
拜谢
~ +公众账号(极安御信
安全
研究院/北京极安御信
安全
研究院)报暗号:“资料” 即可领取视频相关工具、源码、学习资料,和其他逆向工程免费课。
细!腾讯P8
安全
工程师教你如何制作一个微型内核
前言 在看《linux内核设计与实现》的过程中发现只看书对于学习如何设计...我们知道操作系统是一个计算机中最重要的部分,用户需要操作系统来运行各种应用进程,如果说用户
使用
的应用程序是通过操作系统间接调用计算机的
iOS内存管理
如果有不好的地方或者不全面的地方请留言批评指正,
拜谢
~~~ 引发反思 栈怎么清除?会引发什么状况?怎么使栈溢出? 堆空间怎么清除?会引发什么状况?怎么使堆溢出? Class A{ NSString *_name; NSString *_...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章