gpt4 book ai didi

c++ - C++中operator new的重载

转载 作者:行者123 更新时间:2023-11-28 00:18:10 25 4
gpt4 key购买 nike

我想重载"new"运算符。我制作了一个头文件,其中声明了“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;
}

测试.cpp

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

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

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

错误:将“operator new”声明为非函数 #define new new(FILE, LINE)

谁能告诉我这个错误的原因及其适当的解决方案。提前致谢..:)

最佳答案

#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);

看到问题了吗?

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

此外,请注意这个技巧并不完全可靠 - 例如,它会破坏您拥有的任何其他 operator new 声明,或放置 new 调用(包括在使用位置 new 的任何标准 header ); “placement new”是 operator new 的内置重载。

关于c++ - C++中operator new的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28955526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com