C ++ удалил новый оператор, но может создать shared_ptr - PullRequest
0 голосов
/ 03 декабря 2018

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

Предполагая, что у нас есть следующее:

class Base
{
public:
    virtual int request() = 0; 
    void* operator new(long unsigned int size) = delete;
};


class Derived final : public Base
{
public:
    int request() override;
};

int Derived::request()
{
    return 2;
}

На базеЯ удалил новый оператор, потому что не хочу создавать указатели.Я знаю, что это может не иметь никакого смысла, это всего лишь эксперимент.

Когда я вызываю g ++, я получаю ошибку компиляции, чтобы сказать, что новый оператор удален.Именно то, что я ожидал.

int main()
{
    auto d =  std::make_unique<Derived>();
    int value = d->request();
    std::cout << "Request value is " << value << "." << std::endl;

    return 0;
}

Но если я создаю shared_ptr, код компилируется и работает нормально.

    auto d =  std::make_shared<Derived>();

Почему этот код действителен при создании общих указателей.Оператор в этом случае не используется?

1 Ответ

0 голосов
/ 03 декабря 2018

std :: make_shared use глобальное размещение new версия оператора new, std :: allocator :: construct

Необходимо хранить объект исчетчик атомарных ссылок в том же блоке памяти, так что шаблон shared_ptr работает почти равным навязчивому интеллектуальному указателю .

Вы не можете запретить std :: make_shared создать интеллектуальный указатель.

...