C ++中的全局重载New和Delete运算符

时间:2019-03-27 17:29:39

标签: c++ operator-overloading overloading new-operator delete-operator

我已经重载了newdelete运算符,以跟踪我们分配和释放内存的位置。重载的new运算符可以正常工作,但是在尝试使用重载的delete运算符时出现错误。我希望有人可以照亮。可能是些小事。

头文件代码

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;

错误消息

error: expected `;' before 'Numbers

1 个答案:

答案 0 :(得分:0)

您的问题是,不允许您使用带有删除表达式see here的展示位置删除运算符。仅当放置新表达式在构造函数中遇到异常时,才调用它们。

从上面

  

如果构造函数引发异常,则必须在将异常传播回执行放置新表达式的代码之前取消该存储的分配,这就是放置删除功能的目的。