Delete vs Delete [] в пользовательском операторе в C ++ (отличается от обычных вопросов delete vs delete []) - PullRequest
0 голосов
/ 29 мая 2020

Я определяю класс с именем MyNewDeleteAllocator и определяю пользовательские операторы new и delete для этого класса. Этот код не содержит ошибок и отлично работает. Однако у меня есть вопрос о строке 29 моего кода. Кажется, что изменение «delete []» на «delete» ничего не меняет в результатах моего кода.

Я знаю разницу между delete (отдельный объект при выделении "new") и delete [] (массив объектов, выделенных "new []").

Мне было интересно, почему перестановка delete и delete [] здесь, в строке 29, не повлияла на мои результаты.

#include <new>
#include <iostream>

using namespace std;

//Allocator class
class MyNewDeleteAllocator {
public:
    MyNewDeleteAllocator() {}
    ~MyNewDeleteAllocator() {}
    static void* operator new (size_t size);
    static void operator delete (void* p);
};

void* MyNewDeleteAllocator::operator new (size_t size) {
    void* p;
    p = malloc(size);
    if (p == NULL) {
        //Throw bad_alloc.
        std::bad_alloc exception;
        throw exception;
    }
    cout << "MyNewDeleteAllocator::operator new called with size_t " << size << endl;
    return p;
}

void MyNewDeleteAllocator::operator delete (void* p) {
    cout << "MyNewDeleteAllocator::operator delete called. " << endl;
    delete[] p; //THIS IS LINE 29
}


int main()
{
    MyNewDeleteAllocator* p = new MyNewDeleteAllocator; //Create MyNewDeleteAllocator object.

    delete p; //Delete MyNewDeleteAllocator object.

    return 0;
}

1 Ответ

0 голосов
/ 29 мая 2020

Прежде всего, это не распределитель, или ваше соглашение об именах неверно. В C ++ распределитель выделяет память для данного типа, а не для необработанных байтов. Подробнее об этом - https://en.cppreference.com/w/cpp/memory/allocator

Во-вторых, не смешивайте malloc() / delete и new / free(). malloc() следует использовать с free(), new с delete, а не наоборот. Подробнее об этом - { ссылка }

Итак, все, что вам нужно сделать, это заменить malloc() на new. Кроме того, когда вы используете new, C ++ выдаст std::bad_alloc в случае, если он не может выделить запрошенную память.

...