Глобальная перегрузка операторов New и Delete в c ++ - PullRequest
0 голосов
/ 27 марта 2019

Я перегрузил операторы new и delete, чтобы отслеживать, где мы выделяем и освобождаем память.Перегруженный оператор 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);
}

Main

int* Numbers = NewWithDebug int(5);
DeleteWithDebug Numbers; // <---- Error Here;

Сообщение об ошибке

error: expected `;' before 'Numbers

1 Ответ

0 голосов
/ 27 марта 2019

Ваша проблема в том, что вы не можете использовать оператор удаления места размещения с выражением удаления: см. Здесь .Они вызываются только тогда, когда новое выражение размещения встречает исключение в конструкторе.

Из вышеприведенного

Если конструктор выдает исключение, необходимо освободить это хранилище перед распространениемисключение назад к коду, который выполнил новое выражение размещения, и это является целью функций удаления размещения.

...