您的位置:首页 > 其它

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

2010-12-27 21:24 309 查看
无论是 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 的分配的内存地址不一样了,则会出内存错误,这个要切记
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: