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(不管顺序先后)。

原文地址:https://www.cnblogs.com/spriteflk/p/4507450.html