为了检测内存泄露,重载new和delete来检测内存泄漏结果导致placement new操作符不能使用。
void *operator new(size_t size, const char *file, unsigned int line) {
void *ptr = malloc(size);
printf("Call new in [%s]:%d allocate %d mem,mem addr 0X%X\n",file,line,size,ptr);
return ptr;
}
void *operator new[](size_t size, const char *file, unsigned int line) {
void *ptr = malloc(size);
printf("Call new[] in [%s]:%d allocate %d mem,mem addr 0X%X\n",file,line,size,ptr);
return ptr;
}
void operator delete(void *ptr) {
printf("Call delete free mem addr 0X%X\n",ptr);
free(ptr);
}
void operator delete[](void *ptr) {
printf("Call delete[] free mem addr 0X%X\n",ptr);
free(ptr);
}
#define new new(__FILE__,__LINE__)
查了很久最终找到一个解决方案。
#pragma push_macro("new")
#undef new
......
#pragma pop_macro("new")
实例
class Demo
{
};
int main() {
Demo* demo = new Demo;
delete demo;
demo = nullptr;
Demo* demo1 = new Demo[2];
delete[] demo1;
demo1 = nullptr;
char arr[8];
// Demo* demo2 = new (arr) Demo; //placement new 无法使用
#pragma push_macro("new")
#undef new
Demo* demo2 = new(arr) Demo;
#pragma pop_macro("new")
return 0;
}
运行结果