void*指针及delete释放void*内存(转)

转自:

http://blog.163.com/xuelinxu@126/blog/static/7117728220088102340679/


在面向对象语言中,明白什么叫“对象”非常重要,其实最根本最贴切的含义应该是:“对象就是一块命了名的存储空间”。当我们定义 (define)一个对象的时候,系统会在栈中给我们的应用程序分配一块内存,用于存储对象的信息。但是当我们用new操作符来手动的为我们的程序申请一 块内存的时候,情况就有点复杂了。这里我们应当搞清的问题就是:当我们new了一块内存地址的时候,谁应当为这个内存负责?应当怎么初始化这块内存,应当 怎么释放这块内存?内存的释放是很重要的,否则会造成内存泄露。例如:

int *pNum = new int(2);
delete pNum;
每申请一块内存,之后都要释放,这样系统才能把这块内存重新分配,但是,如果是下面这样的代码呢?
void* pVoid = new int(2);
delete pVoid;
这时候内存会正确释放吗?我们知道指针是分类型,特定类型的指针寻址的字节数是不一样的,比如字符指针加一的时候是移动一个字节,int类型指 针加一的时候,移动两个字节。因为第一次申请的是int型的两个字节的内存,如果系统释放内存的时候是按类型释放的话,delete一个int型的指针能 正确释放int型指针所指向的内存,因为系统知道,int型就占两个字节,从指针的起始位置,释放两个字节的指针不就行了?但是,这样看来,第二段代码就 有问题:在第二段代码中,从堆中申请了一个int型的两个字节的内存赋给一个void型的指针,然后释放这个void类型的指针所指向的内存,由于 void类型指针是无类型的,系统无法知道void类型的指针指向多大的内存空间,这样,能正确释放指针所指向的内存空间吗?会不会造成内存泄露?为什么 呢?
    这个时候我们就需要对变量的内存分配有一定的了解。
    比如,int *pNum = new int(2);所申请的内存就是2个字节吗?答案是否定的,每当我们从堆里面申请一块的内存时,系统所分配的内存比对象所占用的内存要稍微大一点,就像 OSI协议中每层都要加一些特定的信息用于辨认一样,系统也会为内存加上一个标识头,用于标识这块内存的边界,这种技术成为cookie,不要以为 cookie是http协议中特有的标识信息,在c++中也有这种技术。其实cookie是一种很古老的技术,最初用来在进城间传递一些信息,后来因为用 于http协议中用来标示用户信息而为世人所熟知。扯远了,回到前面所说。所以当把一个int类型的指针赋给一个void类型的指针,然后用void类型 的指针释放这块内存,会正确释放,因为,类型只是给你看的,系统自有自己的一套标识方法。

回复:

系统也会为内存加上一个标识头,用于标识这块内存的边界,这种技术成为cookie

 

朋友,你说的这种情况只存在于debug,如果你用的是release,那就没有边界的。




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值