Вопрос:

C ++ не освобождает данные при переопределении операторов new и delete

c++ malloc overriding operator-keyword free

65 просмотра

1 ответ

15 Репутация автора

Я заменил новые и удалил операторы глобально для отладки, и я получаю странное поведение, похоже, C ++ не освобождает данные, когда я вызываю delete.

Минимальный код с ошибкой:

#include "stdlib.h"
#include "stdio.h"

// Classes
class A
{
    int i;
public:
    A() { printf("Created A\n"); }
    virtual ~A() { printf("Destroyed A\n"); }
};
class B : public A
{
    int j;
public:
    B() { printf("Created B\n"); }
    ~B() { printf("Destroyed B\n"); }
};

unsigned int num_allocs = 0;
// Custom new/delete
void* operator new(size_t size)
{
    void* p = malloc(size);
    printf("[+] %p (%u)\n", p, size);
    num_allocs += 1;
    return p;
}
void operator delete(void* p)
{
    printf("[-] %p\n", p);
    num_allocs -= 1;
    free(p);
}

struct Z
{
    int k;
};

int main()
{
    printf("Started\n");
    A* a = (B*)(new B);
    Z* z = new Z;
    printf("Will delete\n");
    delete a;
    delete z;
    printf("Finished\n");
    printf("Allocs: %u\n", num_allocs);
    return 0;
}

Вывод (компилируется с MSYS2 + MinGW32 в Windows):

Началось

[+] 003e1a50 (12)

Создано A

Создано Б

[+] 003e8630 (4)

Удалит

Уничтожено Б

Уничтожено

Законченный

Распределение: 2

Осталось 2 выделения! ПОЧЕМУ???

Edit1: Когда я использую флаг -std = c ++ 98 или -std = c ++ 11, ошибка исчезает, флаги -std = c ++ 14 и -std = c ++ 1z воспроизводят ошибку.

Автор: rmalizia44 Источник Размещён: 08.11.2017 11:16

Ответы (1)


0 плюса

22159 Репутация автора

Решение

Это вызывает другую deleteфункцию. Вы должны предоставить определение для

void operator delete(void* ptr, std::size_t size);

При использовании C ++ 17 обе deleteфункции также должны быть noexcept.

Автор: 1201ProgramAlarm Размещён: 09.11.2017 01:16
Вопросы из категории :
32x32