new del 问题
实验一:
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 问题的更多相关文章
- 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 ...
- windows 中去除Ctrl+Alt+Del才能登录
安装windows 7后登录的时候有一样很麻烦的步骤是需要先按Ctrl+Alt+Del,才能输入用户密码进行登录.这里笔者介绍一下如何取消这个东西. 点击“开始菜单”,点击“控制面板”. [管理工具] ...
- day26:面向对象进阶:set、get、del反射和内置
三 __setattr__,__delattr__,__getattr__ __开头的都是内置的,不定义系统都会有.如果自己定义的话,就会覆盖系统内置的,执行自定义的部分(是否有完成设置的语法,有的话 ...
- svn恢复被删除的分支 svn del 分支
笔者不小心,在操作时,删除了一个主开发分支(main_dev). 一. 悲剧的语句: svn del -m"1.误删除分支" http://svr_path/branches/ ...
- python里的del变量无法立刻释放内存的解决办法
最近在python开发的时候,用到了一些很占用内存的操作,导致后续程序执行很慢甚至无法执行.探索了一下,最终解决了这个问题. 截图解释: python变量占用了内存,仅仅通过del变量的方式,只是让这 ...
- Python中remove,del和pop的区别
以a=[1,2,3] 为例,似乎使用del, remove, pop一个元素2 之后 a都是为 [1,3], 如下:http://Novell.Me >>> a=[1,2,3] &g ...
- python del 注意点
>>> del a[:] >>> a [] del也可以用于删除整个变量: >>> >>> del a 之后再引用名称 a 将会 ...
- 事务复制-大批量DEL操作
同事讨论删除发布表历史记录,导致订阅端数据滞后N小时.后来询问得知,发布表T只保留最近31天的数据,每天由Job删除31天前的数据,每天的删除量约400-500万条.默认情况下,在发布端删除400万条 ...
- HTML 文本格式化<b><big><em><i><small><strong><sub><sup><ins><del>
<b> 标签-粗体 定义和用法: <b>标签规定粗体文本. 提示和注释 注释:根据 HTML5 规范,在没有其他合适标签更合适时,才应该把 <b> 标签作为最后的选 ...
- Python 3 条件、循环和assert、pass、del
条件: if 条件: 语句块 elif: 语句块 else: 语句块 elif 表示 else if 这居然是合法的!!!1 < x < 2!!! >> ...
随机推荐
- java 图形界面 Socket编程
一.使用图形界面实现客户端服务器端的通信: 上代码: 服务器端代码: package cn.MyNET; import java.io.*; import java.net.*; import jav ...
- 三层交换机配置说明(华为S5700设置三个网段互通)
1.配置Switch # 创建VLAN <HUAWEI> system-view[HUAWEI] sysname Switch[Switch] vlan batch 10 20 30# 配 ...
- 样式的操作-不同浏览器加载不同的css文件
———————————————————— <script type="text/javascript"> //body加载事件监听函数 ...
- Servlet基础知识
基本知识一.Web结构1.两种应用程序 ①桌面应用程序:QQ.CS.MyEclipse.Office.DW.360.浏览器等必须下载.安装.桌面快捷方式.注册表信息.操作系统后台服务.占用操作系统端口 ...
- strlcpy() 函数
size_t strlcpy(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t ...
- qsdk编译
QSDK是一种在openwrt的基础上,加入了高通atheros芯片相关资料的一种环境. QSDK与openwrt的区别主要在如下几个方面: arch/mips/ath79/* – updated Q ...
- 读苹果开发文档时遇到瓶颈,转而花2天看了Objc基本语法
根据这篇博客中列出的文章开始看Objc基本语法: http://blog.hellolucky.info/articles/ios-beginner-ios-development/ 看完以后,明白多 ...
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
关于如何使用EF Power Tool的介绍请看 http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html, 这里 ...
- Head First--设计模式(装饰者模式)
从现在开始,我将以写一个小软件的方式来进行模式识别的学习,包含需求分析,功能模块设计,原理图设计,程序实现这个几个部分,可能具体的模式模块不可能都包括在内. 需求分析:星巴兹咖啡店已经遍布全世界的很多 ...
- Android Service学习之IntentService 深入分析
什么是IntentService? (本文转自http://blog.csdn.net/gaojie314/archive/2010/11/28/6040701.aspx) 官方的解释是: ...