Что такое голый указатель?

наблюдения Голые Указатели (см. Первый ответ), вопросы довольно прост:

Что такое голый указатель?

4 ответов


вот простой пример:

#include <memory>

struct X { int a,b,c; };

int main()
{
    std::shared_ptr<X> sp(new X);
    X* np = new X;
    delete np;
}

np указатель на объект типа X - Если вы динамически выделили (new / malloc) этот объект, вы должны delete / free его... простой указатель, как np называется "голый указатель".

sp - это объект, который содержит указатель на управляемый ресурс, что означает, что вы можете использовать его так же, как вы бы использовали np, а когда нет shared_ptr объекты, которые владеют этим ресурс, ресурс освобождается, поэтому вам не нужно delete его. смарт-указатели позаботьтесь об управлении памятью, так что вам не придется;)


"голый указатель" - это "простой" указатель, то есть то, что стандартная и любая книга на C++ называют указателем. Это обычное "T *" (где T - Это тип того, на что указывает указатель).

"голая" терминология стала противопоставлять их умный указатели, которые являются классами, которые ведут себя во многих отношениях как указатели (обычно они перегружают операторы *, -> в некоторых случаях []).

умные указатели " умные" поскольку они указывают и применяют некоторую семантику владения, удаляя "немоту" голых указателей: в фактах голые указатели не указывают / знают, если они собственные объект, на который они ссылаются (например, если он должен быть освобожден, когда указатель выходит за рамки), и даже если с некоторым соглашением об именах известно, что некоторый указатель владеет объектом, если указывает на, язык не применяет это, поэтому, если указатель выходит за рамки и никто вручную не выпустил указанный объект (обычно это происходит, если возникает исключение) у вас есть утечка памяти.

интеллектуальные указатели вместо этого используют гарантии системы типов C++ (конструктор копирования, оператор присваивания, гарантированные вызовы деструктора, ...) для установления и обеспечения какого-либо права собственности (обычно: строгий и непередаваемый, строгий, но может быть передан другому интеллектуальному указателю, совместно используемому несколькими интеллектуальными указателями).

... тем не менее, есть тонны обсуждений о умных указателях на StackOverflow и в Интернете, я уверен, что вы сможете найти более обширные обсуждения на умных указателях и почему использование голых указателей, которые имеют собственные объекты, обычно плохоTM в современной программе на C++.


голый указатель (необработанный указатель," тупой " указатель) является указателем в стиле C T*. Сравните это с "умными" указателями C++ предлагает (std::shared_ptr<T>, std::weak_ptr<T> и std::unique_ptr<T>).


Smart pointer являются предпочтительным способом в C++, потому что они предлагают лучшее управление памятью. Интеллектуальные указатели имеют дополнительную информацию (подсчет количества ссылок, текущее владение и т. д.) Вместе с адресом объекта, на который они указывают, и поэтому имя интеллектуального указателя и голого указателя не содержат такой дополнительной информации и, следовательно, имя голого указателя, и поэтому они не удаляют объект после его больше не используется, потому что у них нет информации для этого . Надеюсь, это поможет сохранить в памяти .