new del 问题
实验一:
new_del_caller工程(静态库) -new_del_caller.cpp
1 #include <new> 2 3 void new_del_caller() 4 { 5 char* p = new char[1]; 6 delete [] p; 7 }
new_del工程(控制台程序) -new_del.h
1 #pragma once 2 #include <exception> 3 #include <iostream> 4 5 int i=0; 6 int j=0; 7 8 inline void* operator new(size_t size) throw(std::bad_alloc) 9 { 10 std::cout << "enter our operator new " <<i++ << std::endl; 11 return malloc(size); 12 } 13 14 inline void* operator new[](size_t size) throw(std::bad_alloc) 15 { 16 std::cout << "enter our operator new[] " <<j++ << std::endl; 17 return malloc(size); 18 } 19 20 inline void operator delete(void* ptr) throw() 21 { 22 std::cout << "enter our operator delete " <<--i << std::endl; 23 return free(ptr); 24 } 25 26 inline void operator delete[](void* ptr) throw() 27 { 28 std::cout << "enter our operator delete[] " <<--j << std::endl; 29 return free(ptr); 30 }
new_del工程 -new_del.cpp
1 #include <tchar.h> 2 #include "new_del.h" 3 4 extern void new_del_caller(); 5 6 int _tmain(int argc, _TCHAR* argv[]) 7 { 8 //char* p = new char [1]; 9 //delete [] p; 10 11 new_del_caller(); 12 return 0; 13 }
//输出1: enter our operator new 0
why?
如果对new_del.cpp中放开第一行注释
//输出2: enter our operator new[] 0 enter our operator new[] 1
如果对new_del.cpp中放开所有注释
//输出3: enter our operator new[] 0 enter our operator delete[] 0 enter our operator new[] 0 enter our operator delete[] 0
被注释的内容放在new_del_caller();前还是后,结果是一样的
实验二:
把inline全部去掉,输出结果一样。
//输出1: enter our operator new[] 0 enter our operator delete[] 0
//输出2: enter our operator new[] 0 enter our operator new[] 1 enter our operator delete[] 1
//输出3: enter our operator new[] 0 enter our operator delete[] 0 enter our operator new[] 0 enter our operator delete[] 0
实验一和实验二总结:
静态库中永远使用主工程中编译进的new和delete。
主工程中使用inline,则只在主工程中有用过inline内容(不管出现位置),inline的new和delete内容才会被使用(即编译进)。
如果把主工程中inline全部去掉,则一定全部使用主工程中的new和delete,包括静态库中调用也是(即编译进)。
实验三:
new_del_caller工程(动态库) -new_del_caller.cpp
1 #include <new> 2 3 __declspec(dllexport) void new_del_caller() 4 { 5 char* p = new char[1]; 6 delete [] p; 7 }
new_del工程(控制台程序)不变
//输出1: 没有任何输出
//输出2: enter our operator new[] 0
//输出3: enter our operator new[] 0 enter our operator delete[] 0
实验四:
把inline全部去掉,输出结果一样。
实验三和实验四总结:
动态库中永远使用自己的new和delete。
主工程中使用inline,则只在主工程中有用过inline内容(不管出现位置),inline的new和delete内容才会被使用。
总结:
使用第三方库,最好使用它的动态库版本,防止出现new和delete的不匹配。
如果一定要使用第三方库的静态库版本,必须在主工程中用到自定义的new和delete(不管顺序先后)。