无论是 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 的分配的内存地址不一样了,则会出内存错误,这个要切记