Умный указатель от взлома кода интервью

struct Data
{
    ~Data()
    {
        std::cout << "dtor" << std::endl;
    }
};

template <typename T> class SmartPointer
{

public:
    SmartPointer(T* ptr)
    {
        ref = ptr;
        ref_count = (unsigned int*)malloc(sizeof(unsigned));
        *ref_count = 1;
    }

    SmartPointer(SmartPointer<T>& sptr)
    {
        ref = sptr.ref;
        ref_count = sptr.ref_count;
        ++(*ref_count);
    }

    SmartPointer<T>& operator=(SmartPointer<T>& sptr)
    {
        if (this == &sptr)
            return *this;

        if (*ref_count > 0)
            remove();

        ref = sptr.ref;
        ref_count = sptr.ref_count;
        ++(*ref_count);
        return *this;
    }

    ~SmartPointer()
    {
        remove();
    }

    T getValue()
    {
        return *ref;
    }

private: // protected:
    T* ref = nullptr;
    unsigned* ref_count = nullptr;

    void remove()
    {
        --(*ref_count);
        if (!*ref_count)
        {
            delete ref;
            free (ref_count);
            ref = nullptr;
            ref_count = nullptr;
        }
    }
};

int main()
{
//    Data data;

//    auto data = new Data;
//    delete data;

    auto data = SmartPointer<Data>(new Data);
}

Видел приведенную выше реализацию интеллектуального указателя по взлому кода, интервью, 6-е изд.

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

Если я правильно понимаю, мы можем связать вышеизложенное с общим указателем. И мы приблизимся к уникальному указателю, выполнив

SmartPointer(SmartPointer<T>& sptr) = delete;

Какие функции есть у std::unique_ptr и std::shared_ptr, но отсутствуют у SmartPointer? Думаю, это может спросить интервьюер.

Одно только malloc делает это решение подозрительным. Я бы сказал, что тот, кто написал это, не использует C++ в повседневной жизни.

StoryTeller - Unslander Monica 12.02.2023 15:43

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

Neil Butterworth 12.02.2023 16:29

Разве я не могу просто избавиться от этого malloc и напрямую использовать член unsigned ref, чтобы продемонстрировать поведение интеллектуального указателя? Должен ли интервьюер жаловаться, если я это сделаю?

KcFnMi 12.02.2023 16:41

Сравните со спецификациями? Это явно не имеет ничего общего с unique_ptr, но с shared_ptr различия огромны.

Öö Tiib 12.02.2023 17:32

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

user4581301 12.02.2023 18:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Частный и защищенный различаются только в том случае, если класс унаследован от. Поскольку у вашего SmartPointer нет наследуемых от него классов, нет никакой разницы.

Другие вопросы по теме