#include <iostream>
#include <string.h>
using namespace std;
void* operator new[](size_t size)
{
cout << "void *operator new[](size_t size)" << endl;
void* p = (void*)malloc(size);
cout << p << endl;
return p;
}
void operator delete[](void* phead)
{
cout << "void operator delete[](void *phead)" << endl;
cout << phead << endl;
free(phead);
}
int main(int argc, char* argv[])
{
int* temp = new int[10];
//delete[] temp;
for(int i = 0; i < 10; i++)
{
/*& temp[i]相当于
&(*(temp + i)),本质上就是temp的首地址加偏移量
比如i为0,那么偏移量就是0,i为1偏移量就是4,
所以,当i等于0的时候,已经将new出来的内存完整的释放了,
当i为1的时候,实际上这里有两个错误,一个是
(1)由于偏移量的原因,free的时候,传进去的起始地址已经不是
new出来的首地址了。
(2)就是free两次的问题,把一个不属于自己的内存再次free*/
delete& temp[i];
}
}
linux平台测试:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void* operator new[](size_t size)
{
cout << "void *operator new[](size_t size)" << endl;
void* p = (void*)malloc(size);
cout << p << endl;
return p;
}
void operator delete[](void* phead)
{
cout << "void operator delete[](void *phead)" << endl;
cout << phead << endl;
free(phead);
}
int main(int argc, char* argv[])
{
int* temp = new int[10];
//delete[] temp;
for(int i = 0; i < 10; i++)
{
/*& temp[i]相当于
&(*(temp + i)),本质上就是temp的首地址加偏移量
比如i为0,那么偏移量就是0,i为1偏移量就是4,
所以,当i等于0的时候,已经将new出来的内存完整的释放了,
当i为1的时候,实际上这里有两个错误,一个是
(1)由于偏移量的原因,free的时候,传进去的起始地址已经不是
new出来的首地址了。
(2)就是free两次的问题,把一个不属于自己的内存再次free*/
delete& temp[i];
}
}
没有提示内存泄漏,只是提示了,new与delete不匹配。说明内存已经释放了,释放的语句为
delete &temp[0];
将代码稍微改一下:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void* operator new[](size_t size)
{
cout << "void *operator new[](size_t size)" << endl;
void* p = (void*)malloc(size);
cout << p << endl;
return p;
}
void operator delete[](void* phead)
{
cout << "void operator delete[](void *phead)" << endl;
cout << phead << endl;
free(phead);
}
int main(int argc, char* argv[])
{
int* temp = new int[10];
//delete[] temp;
for(int i = 0; i < 10; i++)
{
/*& temp[i]相当于
&(*(temp + i)),本质上就是temp的首地址加偏移量
比如i为0,那么偏移量就是0,i为1偏移量就是4,
所以,当i等于0的时候,已经将new出来的内存完整的释放了,
当i为1的时候,实际上这里有两个错误,一个是
(1)由于偏移量的原因,free的时候,传进去的起始地址已经不是
new出来的首地址了。
(2)就是free两次的问题,把一个不属于自己的内存再次free*/
delete& temp[2];
}
}
可以看到提示,free的时候,是释放不属于自己的内存。