new del 问题

时间:2021-07-30 19:25:00

实验一:

new_del_caller工程(静态库) -new_del_caller.cpp

 #include <new>

 void new_del_caller()
{
char* p = new char[];
delete [] p;
}

new_del工程(控制台程序) -new_del.h

 #pragma once
#include <exception>
#include <iostream> int i=;
int j=; inline void* operator new(size_t size) throw(std::bad_alloc)
{
std::cout << "enter our operator new " <<i++ << std::endl;
return malloc(size);
} inline void* operator new[](size_t size) throw(std::bad_alloc)
{
std::cout << "enter our operator new[] " <<j++ << std::endl;
return malloc(size);
} inline void operator delete(void* ptr) throw()
{
std::cout << "enter our operator delete " <<--i << std::endl;
return free(ptr);
} inline void operator delete[](void* ptr) throw()
{
std::cout << "enter our operator delete[] " <<--j << std::endl;
return free(ptr);
}

new_del工程 -new_del.cpp

 #include <tchar.h>
#include "new_del.h" extern void new_del_caller(); int _tmain(int argc, _TCHAR* argv[])
{
//char* p = new char [1];
//delete [] p; new_del_caller();
return ;
}
//输出1:
enter our operator new

why?

如果对new_del.cpp中放开第一行注释

//输出2:
enter our operator new[]
enter our operator new[]

如果对new_del.cpp中放开所有注释

//输出3:
enter our operator new[]
enter our operator delete[]
enter our operator new[]
enter our operator delete[]

被注释的内容放在new_del_caller();前还是后,结果是一样的

实验二:

把inline全部去掉,输出结果一样。

//输出1:
enter our operator new[]
enter our operator delete[]
//输出2:
enter our operator new[]
enter our operator new[]
enter our operator delete[]
//输出3:
enter our operator new[]
enter our operator delete[]
enter our operator new[]
enter our operator delete[]

实验一和实验二总结:

静态库中永远使用主工程中编译进的new和delete。

主工程中使用inline,则只在主工程中有用过inline内容(不管出现位置),inline的new和delete内容才会被使用(即编译进)。

如果把主工程中inline全部去掉,则一定全部使用主工程中的new和delete,包括静态库中调用也是(即编译进)。

实验三:

new_del_caller工程(动态库) -new_del_caller.cpp

 #include <new>

 __declspec(dllexport) void new_del_caller()
{
char* p = new char[];
delete [] p;
}

new_del工程(控制台程序)不变

//输出1: 没有任何输出
//输出2:
enter our operator new[]
//输出3:
enter our operator new[]
enter our operator delete[]

实验四:

把inline全部去掉,输出结果一样。

实验三和实验四总结:
动态库中永远使用自己的new和delete。

主工程中使用inline,则只在主工程中有用过inline内容(不管出现位置),inline的new和delete内容才会被使用。

总结:

使用第三方库,最好使用它的动态库版本,防止出现new和delete的不匹配。

如果一定要使用第三方库的静态库版本,必须在主工程中用到自定义的new和delete(不管顺序先后)。