Что такое голый указатель?
наблюдения Голые Указатели (см. Первый ответ), вопросы довольно прост:
Что такое голый указатель?
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++, потому что они предлагают лучшее управление памятью. Интеллектуальные указатели имеют дополнительную информацию (подсчет количества ссылок, текущее владение и т. д.) Вместе с адресом объекта, на который они указывают, и поэтому имя интеллектуального указателя и голого указателя не содержат такой дополнительной информации и, следовательно, имя голого указателя, и поэтому они не удаляют объект после его больше не используется, потому что у них нет информации для этого . Надеюсь, это поможет сохранить в памяти .