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

  • 相关阅读:
    c++ --> 虚函数
    Algorithm --> 全排列
    Algorithm --> 矩阵链乘法
    STL --> set用法
    STL --> list用法
    Algorithm --> 最长公共子序列(LCS)
    Zookeeper使用实例——服务节点管理
    Zookeeper使用实例——分布式共享锁
    Zookeeper初探
    Java设计模式应用——备忘录模式
  • 原文地址:https://www.cnblogs.com/spriteflk/p/4507450.html
Copyright © 2020-2023  润新知