重载new-宏替换区分new、new(nothrow)和new placement

问题描述

宏替换区分new、new(nothrow)和new placement

目前正在写一个内存泄漏检测的项目,通过重载new和delete的方式实现,重载的new记录了内存申请操作的文件名和行号,重载形式为 operator new(int size ,char*file,int line);

  • 为了使被检测代码使用new的地方调用我们重载版本的new ,需要对被检测的源代码进行宏替换 #define new new(__FILE,__LINE) ; 但是这会引起新的问题,因为有些被检测代码中存在
    new(nothrow) 和 new(A,Point*B)(A为一个自定义类型,B指向已经申请了的一片内存空间) ;*宏替换会将new的这两种用法也替换掉 形成
    new(__FILE,__LINE) (nothrow)和new(__FILE,__LINE) (A,Point*B) 的形式,*这对于g++编译器是编译通不过的,而且new的这两种用法又无法重载,不知有大神遇到过类似的问题吗,或是有比较好的方法能够比较智能的实现替换,后面两种new的使用不进行宏替换,只进行普通new的替换 。

期待大神解答,急求,急求 !!

解决方案

http://www.cnblogs.com/xuxm2007/archive/2011/12/14/2288185.html

解决方案二:

C++ new 和Placement New 以及nothrow new
C++中的new和Placement New 以及nothrow new
new、nothrow new和placement new 原理分析

时间: 2024-11-08 19:15:25

重载new-宏替换区分new、new(nothrow)和new placement的相关文章

一个关于C语言宏替换的问题

在之前的一个项目中,通过macro来定义了一组位掩码: #define FLAG_TYPE1 0x0001 #define FLAG_TYPE2 0x0002 #define FLAG_TYPE3 0x0004 #define FLAG_TYPE4 0x0008 ... #define TYPE(type) (FLAG_TYPE##type) (这里对实例进行了简化,实例中将 TPYE 定义为 1<<(type-1) 并不妥当.) 由于使用这组位掩码的地方并不止一处,使用这个macro时传递的

Javascript中如何执行变量中的命令语句:即所谓的宏替换

由其做动态编程时非常有用,必须符合js中的语法,用eval能够执行. var aaa="alert('这是变量中的语句')"; eval(aaa); 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/script/

现代C++中的预处理宏

现代C++中的预处理宏 --徐东来 摘要:在C++从C继承的遗产中,预处理宏是其中的一部分.在现代C++的发展过程中,预处理宏是否还有意义?本文将讨论之. 关键字:预处理 宏 #define #pragma      C++中有那么多灵活的特性,例如重载.类型安全的模板.const关键字等等,为什么程序员还要写"#define"这样的预处理指令?    典型的一个例子,大家都知道"const int a=100;"就比"#define a 100"

宏的妙用

1.概述 C++中出了const关键字以后,宏定义常量的功能已经不在被推荐使用.这使 得宏似乎没有了用武之地.实际上,宏还可以做很多事情,笔者也难以全部列举 .这里,仅仅列举几个典型的用法,希望大家能够从中获益. 2.实现多环境兼容 常见的情况是,我们实现了一个函数,希望它只在某种编译条件满足是被编译和使用.例如,我希望在源码中插入调试语句,以便以Debug方式运行时能够 通过调试信息观察程序运行情况.但是,在产品发售给用户时,我又希望这些调 试信息不要输出,以降低代码尺寸,提高运行性能. 这一

c++中枚举常量与宏常量的一点区别

  #include<iostream> using namespace std; class A { enum { APPLE = 111 }; #define PEAR 333 public: A() { cout << "APPLE: " << APPLE << endl; // 私有枚举常量,只有在类内部可以访问. } }; int main() { A a; //cout << "APPLE: "

怎样很好的将java中的构造重载学好(初学者)

问题描述 怎样很好的将java中的构造重载学好(初学者) 现在初学,但是在写代码的时候总是无法使用构造重载这种方法,并且在写代码的时候老是思绪混乱应该怎莫办??????? 解决方案 java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析 1 普通方法的重载 普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利

编程-写一个宏定义#define 求高手作答。

问题描述 写一个宏定义#define 求高手作答. 今天突发奇想,object C里面 @""hello"" 就代表了 hello 的字符串. 然后C++里面 ""hello"" 即代表 hello 字符串. 能否写个define 类似于 @""__str__"" = ""__str__"" 的功能. 类似 #define @""

【原创】G_STRLOC 宏

       研究 MySQL Proxy 源码过程时,经常会看到类似下面这种调试打印:  ? 1 2 3 if (0 != network_mysqld_con_command_states_init(con, &p)) {     g_debug("%s: ", G_STRLOC); }        其中的  G_STRLOC 是什么呢? 查看 glib 的源码(glib-2.35.4),可知  ? 1 2 #define G_STRINGIFY(macro_or_str

宏定义中的##操作符和... and _ _VA_ARGS_ _

1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co