实验一:

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. TODO:小程序的使用体验

    TODO:小程序的使用体验 2017.01.09小程序如期而至,话说十年前的今天2007.01.09是第一代iPhone发布日期. 清晨朋友圈发了一张小程序的截图,很多朋友问用什么版本的微信才有小程序 ...

  2. ExecutorService的submit(Runnable x)和execute(Runnable x) 两个方法的本质区别

    Runnable任务没有返回值,而Callable任务有返回值.并且Callable的call()方法只能通过ExecutorService的submit(Callable <T> tas ...

  3. 字符串匹配算法之KMP

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  4. 感知哈希算法的java实现

    一.原理讲解      实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹 ...

  5. 《JS权威指南学习总结--4.13运算符》

    一.typeof运算符     typeof是一元运算符,放在其单个操作数的前面,操作数可以是任意类型.返回值为表示操作数类型的一个字符串.     例如:     typeof x          ...

  6. 手机版WEB开发经验分享,手机版网站开发注意事项,网站自适应,手机版网站自适应,移动安卓APP自适应

    转自 http://my.oschina.net/cart/blog/282477 做前端开发不短了,用过jQuery Mobile jqMobi 也纯手工写过.. 最后总结如下: jQuery Mo ...

  7. asp.net html table to DataTable

    添加引用 http://htmlagilitypack.codeplex.com/downloads/get/437941 protected void Export(string content,s ...

  8. sudo su– user

    [root@localhost ~] # visudo –f /etc/sudoers 在文件中的root账户下添加需要切换root账户的账户 root ALL=(ALL) ALL user ALL= ...

  9. VB webbrowser 控件的应用(跨域 内嵌网页元素的访问)

    自动登录财付通,难点在于会出现验证码,并且验证码页是在iframe元素下的,出于各种安全考虑,webbrowser控件不提供这种访问机制!当然,第一想到的是将这个网页拿出来,可是输入完毕验证码后,点击 ...

  10. HTML之组件margin、padding

    1.  HTML之组件可以通过CSS里的width height进行大小控制 2.HTML之组件可以通过CSS里的margin.padding进行组件和组件间的间距 margin/padding:(u ...