C++ C+中新运算符的重载+;

C++ C+中新运算符的重载+;,c++,C++,我想让“新”接线员超负荷工作。我制作了一个头文件,其中声明了“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> #inc

我想让“新”接线员超负荷工作。我制作了一个头文件,其中声明了“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;
}
#include <iostream>
#include "mynew.h"
using namespace std;

int main()
{
   int * ptr1 = new int;
   cout << "Address : " << ptr1 << endl;
   //delete ptr1;
   return 0;
}
#包括
#包括
#包括
#包括“mynew.h”
使用名称空间std;
#未定义新
void*运算符新(std::size\u t size,const char*文件,无符号整数行){
void*ptr=malloc(尺寸);
cout
#define
s定义后的任何地方都要工作

这意味着:

#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
行移动到
操作符new
声明之后


此外,请注意,此技巧并非完全可靠-例如,它将破坏您拥有的任何其他
运算符new
声明,或placement
new
调用(包括在使用placement
new
的任何标准标头中);“placement
new
”是一个内置的
操作符new

重载。你把
操作符new
和通俗的
新操作符混为一谈,后者是语言中内置的关键字,不能(不应该)被重新定义。
new
操作符调用
operator new
首先分配内存,然后调用传递对象的构造函数。即使该宏是合法的,您的函数也不会扩展到:
void*操作符new(______文件,u__线)(std::size_t size,const char*文件,unsigned int LINE)
?@vsoftco你从来没有听说过重载
new
?@immibis我听说过重载
操作符new
,而不是关键字
new
。似乎OP正在重新定义一个关键字:
#定义新的(uuu文件,u行u)
这似乎是一个确定的解决方案disaster@vsoftco是的,他/她正在使用预处理器将
新的
调用替换为他/她采用文件和行号的重载版本。它不可移植,但在实践中可能会起作用,这不是错误的原因。除了作为关键字而不是函数之外,这是注释使用了
assert
@immibis…所使用的相同原则。但在运算符new…的取消公差后移动#define行后,注释仍然不起作用:(…您也可以签入您的系统。它给出了相同的错误。@immibis…感谢您的评论。但是在声明运算符new之后移动#define行后它仍然不起作用…:(…您也可以签入您的系统…它给出了相同的错误。