在C ++中重载operator new

时间:2015-03-10 03:10:18

标签: c++

我想超载' new'运营商。我创建了一个Header文件,其中包含了' new'宣布。

HeaderNew.h

#ifndef MYNEW_H
#define MYNEW_H

#define  new    new(__FILE__, __LINE__)

void* operator new(std::size_t size, const char* file, unsigned int line);

#endif

myNew.cpp

#include<iostream>   
#include<malloc.h>
#include<cstddef>
#include "mynew.h"
using namespace std;

#undef      new

void* operator new(std::size_t size, const char* file, unsigned int line){
    void *ptr = malloc(size);
    cout << "This is overloaded new." << endl;
    cout << "File : " << file << endl;
    cout << "Line : " << line << endl;
    cout << "Size : " << size << endl;
    return ptr;
}

TEST.CPP

#include <iostream>
#include "mynew.h"
using namespace std;

int main()
{
   int * ptr1 = new int;
   cout << "Address : " << ptr1 << endl;
   //delete ptr1;
   return 0;
}

在这里,我想知道&#39; new&#39;的文件名和行号。 test.cpp中使用的运算符。但是我得到了如下所述的错误。

错误:将'operator new'声明为非函数     #define new new( FILE LINE

有谁能告诉我这个错误的原因&amp;适当的解决方案。在此先感谢.. :))

1 个答案:

答案 0 :(得分:3)

#define在定义后无处不在。

这意味着:

#define  new    new(__FILE__, __LINE__)
void* operator new(std::size_t size, const char* file, unsigned int line);

由预处理器改为:

void* operator new(__FILE__, __LINE__)(std::size_t size, const char* file, unsigned int line);

看到问题?

尝试在声明#define之后移动operator new行。

另外,请注意这个技巧并不完全健壮 - 例如,它会破坏您拥有的任何其他operator new声明或展示new次调用(包括使用展示位置的任何标准标头{ {1}}); “展示位置new”是new的内置重载。