实验一:

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. JPA 系列教程10-双向一对一关联表

    双向一对一关联表的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255 ...

  2. 使用NSURLProtocol实现UIWebView的离线缓存

    http://blog.csdn.net/youcanping2008/article/details/9240487

  3. hdu_2224_The shortest path(dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2224 题意:双调欧几里德旅行商经典问题,找一条最短回路使得该路经过所有的点 题解:dp[i][j]=d ...

  4. storm 使用过程中遇到的问题

    1 bolt不停重启,excutor无法启动. nimbus日志类似如下(), 2014-03-12 10:55:06 b.s.d.nimbus [INFO] Executor MITAS3-74-1 ...

  5. C#连接Oracle的方法

    C#连接Oracle的方法 方法1: System.Data.OracleClient oracleConnectionString : data source = orcl;user id= sco ...

  6. c# 快速验证代理IP是否有用

    public void yanzhen(string str, int port) { WebProxy proxyObject = new WebProxy(str, port);//str为IP地 ...

  7. ecshop 去版权(前台)

    该偏文章模板堂搜集总结,包括ecshop前台版权,ecshop后台版权,一个都不留,干干净净,推荐收藏 一.去掉网页标题 Powered by ECShop 打开includes/lib_main.p ...

  8. 去掉input text后面的叉

    如题 input[type=text]::-ms-clear{ display: none; } input::-webkit-search-cancel-button{ display: none; ...

  9. HttpCookie类

    转自:http://www.cnblogs.com/kissdodog/archive/2013/01/08/2851937.html HttpCookie类专门由C#用于读取和写入Cookie的类. ...

  10. dirname(_file_) DIRECTORY_SEPARATOR

    <?php echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:\www\test.php echo dirname(__FILE__); // 取得当前文件所在的绝对目录, ...