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

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

12 голосов
/ 15 февраля 2012

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

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

Ответы [ 4 ]

13 голосов
/ 15 февраля 2012

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

#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 it ... простой указатель, например np называется "голый указатель" .

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

12 голосов
/ 15 февраля 2012

«Обнаженный указатель» - это «простой» указатель, т. Е. То, что в стандарте и любой другой книге по C ++ указатель вызова.Это обычный «T *» (где T - это тип того, на что указывает указатель).

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

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

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

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

10 голосов
/ 15 февраля 2012

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

4 голосов
/ 27 апреля 2014

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

...