在C++中全局重载新的和删除的运算符

在C++中全局重载新的和删除的运算符,c++,operator-overloading,overloading,new-operator,delete-operator,C++,Operator Overloading,Overloading,New Operator,Delete Operator,我重载了new和delete操作符来跟踪我们在哪里分配和释放内存。重载的new运算符工作正常,但在尝试使用重载的delete运算符时出现错误。我希望有人能给我点启示。可能是小问题 头文件代码 源文件代码 主要 错误消息 错误:应为“;”在'Numbers之前,您的问题是不允许对删除表达式使用placement delete运算符:。只有当新表达式在构造函数中遇到异常时,才会调用它们 从上面 如果构造函数抛出异常,则必须先释放该存储,然后再将异常传播回执行placement new表达式的代码,这

我重载了new和delete操作符来跟踪我们在哪里分配和释放内存。重载的new运算符工作正常,但在尝试使用重载的delete运算符时出现错误。我希望有人能给我点启示。可能是小问题

头文件代码

源文件代码

主要

错误消息


错误:应为“;”在'Numbers

之前,您的问题是不允许对删除表达式使用placement delete运算符:。只有当新表达式在构造函数中遇到异常时,才会调用它们

从上面

如果构造函数抛出异常,则必须先释放该存储,然后再将异常传播回执行placement new表达式的代码,这就是placement delete函数的目的


如果我这样做,您不会传递要删除的参数编号DeleteWithDebug Number,我收到此错误,错误:“0,\函数\函数”不能用作函数,这就是我删除第二条注释的原因。我想了几秒钟,发现了我的错误。顺便说一句,你没有在new/delete中调用构造函数/析构函数。您可能想使用::new和::delete而不是malloc/free。相关:那么您是说我不能这样做?void运算符deletevoid*p,常量字符*文件,int行,常量字符*函数;,我真的很想在代码中跟踪释放。还有其他方法吗?要实现您想要的,您不需要重载运算符,因为您必须使用宏。只需编写一个函数宏,在执行实际的新建或删除操作之前插入调试打印
void *operator new[] (size_t size, const char *file, int line, const char *function);
void operator delete(void *p, const char *file, int line, const char *function);

// other operators

#define NewWithDebug new (__FILE__, __LINE__, __FUNCTION__)
#define DeleteWithDebug delete (__FILE__, __LINE__, __FUNCTION__)
void *operator new (size_t size, const char *file, int line, const char *function)
{
    printf("Memory Allocated (Size %zu): file= %s , function = %s , line =%d \n", size, file, function, line );
    return malloc(size);
}

void *operator new[] (size_t size, const char *file, int line, const char *function)
{
    printf ("Memory Allocated (Size %zu): file= %s , function = %s , line =%d \n", size, file, function, line);
    return malloc(size);
}


void operator delete(void *p, const char *file, int line, const char *function)
{
    printf("Memory Deallocated: file= %s , function = %s , line =%d \n", file, function, line);
    free(p);
}
int* Numbers = NewWithDebug int(5);
DeleteWithDebug Numbers; // <---- Error Here;