实验一:

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

new del 问题的更多相关文章

  1. leggere la nostra recensione del primo e del secondo

    La terra di mezzo in trail running sembra essere distorto leggermente massima di recente, e gli aggi ...

  2. windows 中去除Ctrl+Alt+Del才能登录

    安装windows 7后登录的时候有一样很麻烦的步骤是需要先按Ctrl+Alt+Del,才能输入用户密码进行登录.这里笔者介绍一下如何取消这个东西. 点击“开始菜单”,点击“控制面板”. [管理工具] ...

  3. day26:面向对象进阶:set、get、del反射和内置

    三 __setattr__,__delattr__,__getattr__ __开头的都是内置的,不定义系统都会有.如果自己定义的话,就会覆盖系统内置的,执行自定义的部分(是否有完成设置的语法,有的话 ...

  4. svn恢复被删除的分支 svn del 分支

    笔者不小心,在操作时,删除了一个主开发分支(main_dev). 一. 悲剧的语句: svn del  -m"1.误删除分支"  http://svr_path/branches/ ...

  5. python里的del变量无法立刻释放内存的解决办法

    最近在python开发的时候,用到了一些很占用内存的操作,导致后续程序执行很慢甚至无法执行.探索了一下,最终解决了这个问题. 截图解释: python变量占用了内存,仅仅通过del变量的方式,只是让这 ...

  6. Python中remove,del和pop的区别

    以a=[1,2,3] 为例,似乎使用del, remove, pop一个元素2 之后 a都是为 [1,3], 如下:http://Novell.Me >>> a=[1,2,3] &g ...

  7. python del 注意点

    >>> del a[:] >>> a [] del也可以用于删除整个变量: >>> >>> del a 之后再引用名称 a 将会 ...

  8. 事务复制-大批量DEL操作

    同事讨论删除发布表历史记录,导致订阅端数据滞后N小时.后来询问得知,发布表T只保留最近31天的数据,每天由Job删除31天前的数据,每天的删除量约400-500万条.默认情况下,在发布端删除400万条 ...

  9. HTML 文本格式化<b><big><em><i><small><strong><sub><sup><ins><del>

    <b> 标签-粗体 定义和用法: <b>标签规定粗体文本. 提示和注释 注释:根据 HTML5 规范,在没有其他合适标签更合适时,才应该把 <b> 标签作为最后的选 ...

  10. Python 3 条件、循环和assert、pass、del

    条件: if 条件:     语句块 elif:     语句块 else:     语句块 elif 表示 else if 这居然是合法的!!!1 < x < 2!!! >> ...

随机推荐

  1. 微信a标签不跳转

    [问题] 微信页面开发时,各个主页之间的跳转,完全是通过a链接进行的,但是来回跳转几次,再次从其他主页面跳回首页的时候,微信头部出现了跳转加载进度条,但是就是不跳转,也没有任何反应 [范围] 只出现在 ...

  2. python_变量的命名规则

    python 变量的命名规则: 1. 要具有描述性 2.变量名只能由 数字,字母 ,下划线 组成,不可以是空格或者特殊字符(#!%……&) 3.不能以数字开头 4.保留字符不可用(print ...

  3. Python Tools

    [TOC] Python virtualenv.fabric 和 pip 是 pythoneer 的三大神器 pip pip pip是一个安装和管理Python包的工具,是easy_install的一 ...

  4. 《C++ Primer》之面向对象编程(二)

    构造函数和复制控制 每个派生类对象由派生类中定义的(非 static)成员加上一个或多个基类子对象构成,当我们构造.复制.赋值和撤销一个派生类对象时,也会构造.复制.赋值和撤销这些基类子对象. 构造函 ...

  5. leetcode404-----简单的树的遍历

    Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...

  6. LeetCode OJ 107. Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  7. Android onTouchEvent方法

    onTouchEvent方法简介 前面已经介绍了手机键盘事件的处理方法,接下来将介绍手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法, ...

  8. 设计一种前端数据延迟加载的jQuery插件(2)

    背景 最近看到很多网站都运用到了一种前端数据延迟加载技术,包括淘宝,新浪网等等,这样做的目的可以使得一些未显示的图片随 着滚动条的滚动进行延迟显示. 好处显而易见,可以减少前端对于图片的Http请求, ...

  9. EntityFramwork所有 SSDL 项目都必须以同一提供程序为目标。ProviderManifestToken“2008”不同于以前遇到的“2005”

    再用spring+mvc+EF搭建框架时,出现这个问题,网上没有找到类似的问题,删除实体重建后莫名其妙的好了,2008指的是连得数据库实例是2008版本的,2005指的是2005版本,出现问题的原因是 ...

  10. javaScript 新学习:Array.contains 函数

    Array.contains 函数 确定指定对象是否是 Array 对象中的元素. 此函数是静态的,可在不创建对象实例的情况下调用. var itemExists = Array.contains(a ...