我想超载' 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;适当的解决方案。在此先感谢.. :))
答案 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
的内置重载。