关于内存分配与释放的解析

无论是 malloc,还是 new 分配的内存,如下
struct stTest
{
    char a[10000];
};

stTest *p = (stTest *)malloc(sizeof(stTest));
char *p2 = (char *)p;
free(p2);   ///经这样释放后不会引起内存泄露
p2 = NULL;

stTest *p = new stTest;
char *p2 = (char *)p;
delete p2; ///经这样释放后不会引起内存泄露
p2 = NULL;

如下也不会有内存泄露
struct stTest
{
    char a[10000];  ///注意没有析构与构造函数
};

struct stTest2
{
    char a[999];   ///注意没有析构与构造函数
};

stTest *p = new stTest;
stTest2 *p2 = (stTest2 *)p;
delete p2;  ///经这样释放后不会引起内存泄露
p2 = NULL;

因为我们分配或释放的内存指针,必须是 new(delete),malloc(free)配对的内存指针,也就是指向的地址是必须是一致的,这样释放就不会有错.
举个例子
stTest *p = new stTest;///分配内存后,p指向的内存地址假设为 0x10245678
stTest2 *p2 = (stTest2 *)p; ///转化后 p2指向的内存地址也为 0x10245678
delete p2;  ///delete 释放的内存地址与 new 的分配的内存地址一样,
            ///都是 0x10245678,所以不会泄露,只要遵循这个原则,不管类型怎么转化,内存也不会泄露
但是如下,则会出内存错误
stTest *p = new stTest;///分配内存后,p指向的内存地址假设为 0x10245678
char *pTemp = (char *)p;
stTest2 *p2 = (stTest2 *)(pTemp + 0x80); ///转化后 p2指向的内存地址则成了 0x10245678 + 0x80;
delete p2;  ///delete 释放的内存地址与 new 的分配的内存地址不一样了,则会出内存错误,这个要切记

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值