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
и напрямую использовать член unsigned ref
, чтобы продемонстрировать поведение интеллектуального указателя? Должен ли интервьюер жаловаться, если я это сделаю?
Сравните со спецификациями? Это явно не имеет ничего общего с unique_ptr, но с shared_ptr различия огромны.
Интервьюер, скорее всего, спросит вас, как бы вы починили сломанную машину. Все образцы кода должны быть убраны до того, как вы пройдете собеседование, и после этого интервьюер больше заинтересован в ваших методах решения проблем, чем в способностях кодирования.
Частный и защищенный различаются только в том случае, если класс унаследован от. Поскольку у вашего SmartPointer
нет наследуемых от него классов, нет никакой разницы.
Одно только
malloc
делает это решение подозрительным. Я бы сказал, что тот, кто написал это, не использует C++ в повседневной жизни.