C++ C+中新运算符的重载+;
我想让“新”接线员超负荷工作。我制作了一个头文件,其中声明了“new”的宏 HeaderNew.hC++ 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
#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
声明,或placementnew
调用(包括在使用placementnew
的任何标准标头中);“placementnew
”是一个内置的操作符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行后它仍然不起作用…:(…您也可以签入您的系统…它给出了相同的错误。