LINUX.ORG.RU

Где почитать про умные указатели в с++

 


0

1

Добрый день, я как дед-пердед, долгие годы программировал на си с классами по когда-то давно усвоенному местечковому стандарту с выбрасыванием из си++ всех новомодных фишек и только олдскул, только коды возврата и все в таком духе. Вот сколько ни читаю про умные указатели, везде коротенькие статьи типа это unique, а вот это shared, a вот это weak, вот так его можно применить и т.д., но все крайне сжато и на синтетических примерах. А есть ли где-нибудь статья страниц на 20 или какой-нибудь классический труд где все подробно разжевывается зачем и почему и почему так лучше. (англоязычная тоже подойдет). В общих чертах я хотел бы видеть, что вот во времена мамонтов писали на голых указателях, потом в гражданочку пришли к auto_ptr и желательно, что бы везде было по 10 примеров почему так плохо и почему стало лучше, но нет этого нигде.

А есть ли где-нибудь статья страниц на 20 или какой-нибудь классический труд где все подробно разжевывается зачем и почему и почему так лучше.

Умные указатели нужны, чтоб не упустить освобождение памяти и не использовать освобожденную. Все.

Serral
()

Просто добавь себе правило: Никогда не использовать new и никогда не использовать delete. Коротко, это всё.

Подробнее, прочитай вот эти 25 правил про управление ресурсами: http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#S-resource

А вообще можешь и все правила прочитать, как время будет…

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)

В Effective Modern C++ есть глава о них.

xaizek ★★★★★
()
Ответ на: комментарий от Serral

Пусть напишет с 10-к примеров строчек на 500-800 (можно усложнить куски из учебничков, можно взять куски реальных программ, можно самому придумать) с обычными указателями с проверками и обработкой ошибок, а потом перепишет их на умные, убирая ставшие ненужными обвязки. После этого использование или не использование умных указателей станет осознанным.

anonymous
()
Ответ на: комментарий от fsb4000

В С++ нет таких правил. В С++ можно писать как угодно. То, ссылку на что ты дал - рекомендованные практики. Не стоит путать теплое с мягким.

anonymous
()

Мне когда то очень понравился Джефф Элджер «C++ библиотека программиста» (есть в сети). Она может несколько устарела, и ее тут многие ругали, но там в т.ч. про умные указатели довольно подробно расписано.

AntonI ★★★★
()

Хайзек уже упомянул 2ю редакцию Майерса. На счет подробного изложения истории, что было и почему плохо, и что стало, и ещё с примерами - такого документа вообще может и не существовать. И это посложнее, чем написать главу на тему последнего стандарта.

seiken ★★★★★
()
Ответ на: комментарий от shooter93

Вопрос, о котором часто забывают — это кастование умных указателей вверх и вниз по иерархии классов. Для shared_ptr в стандартной библиотеке есть шаблоны static_pointer_cast, dynamic_pointer_cast и другие. Для unique_ptr таких же шаблонов почему-то не занесли, но их нетрудно найти на StackOverflow.

Вся суть C++ в одном абзаце.

hateyoufeel ★★★★★
()

Не буду приводить примеров, но порекомендую какой-нибудь собственный код переписать с умными указателями. Заметишь разницу.

a1batross ★★★★★
()
Ответ на: комментарий от hateyoufeel

Вся суть C++ в одном абзаце.

До конца же надо читать статью:

Впрочем, я не являюсь гуру C++, и вполне мог о чем-то забыть или чего-то не учесть. Так что, если вы видите в приведенном тексте какие-либо косяки, или вам есть, что к нему добавить […]

Так что эта «суть» больше говорит о знаниях автора, чем о С++.

И вообще, с такими поворотами в сюжетной линии темы надо бы в Talks переходить.

seiken ★★★★★
()
Ответ на: комментарий от seiken

И вообще, с такими поворотами в сюжетной линии темы надо бы в Talks переходить.

А это разве не филиал Talks?

hateyoufeel ★★★★★
()
Ответ на: комментарий от shooter93

weak_ptr не особо объясняется. Где ни пишут про него - почти везде пишут, что он для разрыва циклов, а это лишь частный случай. Как будто никто не понимает, что он такое по сути.

anonymous
()
Ответ на: комментарий от fsb4000

Просто добавь себе правило: Никогда не использовать new и никогда не использовать delete. Коротко, это всё.

Никогда

Как и

Всегда

- это удел джунов.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

это удел джунов.

Молодец что записал Александреску в джуны. Он в своих выступлениях на конференциях использовал слова always и never.

Это удел тех кто не боится давать прямые ответы на вопросы.

fsb4000 ★★★★★
()
Ответ на: комментарий от lovesan

Тебе на твои бенчмарки ответили как только они появились. Но тебе же только потроллить.

anonymous
()
Ответ на: комментарий от fsb4000

unique_ptr - вещь нишевая, применимая в крайне малом количестве случаев. Для общего случая используется shared/intrusive - а это всё, привет производительности

lovesan ★★
()
Ответ на: комментарий от roof

С удовольствием посмотрю на наследника std::enable_shared_from_this, не использующего new.

#include <memory>

struct A : std::enable_shared_from_this<A> {
    auto self() { return shared_from_this(); }
};

int main() {
    auto a = std::make_shared<A>();
    auto b = a->self();
}
Serral
()
Ответ на: комментарий от lovesan

Для общего случая используется shared/intrusive - а это всё, привет производительности

Для общего случая указатели вообще не используются, если уж на то пошло.

Serral
()

Если тебе надо 20 страниц с предысторией и с ложечкой чтобы понять простейшие вещи, тебе не надо программировать на C++. Лопату попробуй или метлу.

anonymous
()

Думаю время настало, хотите ли вы поговорить о Русте? У меня для вас есть одна очень хорошая книга…

abcq ★★
()
Ответ на: комментарий от Serral

На глупый ответ умных вопросов как-то не возникает. Надеюсь, что ты просто решил типа пошутить и код как ниже в прод не пишешь)

#include <memory>

struct A : std::enable_shared_from_this<A> {
    auto self() { return shared_from_this(); }
};

int main() {
    A a; 
    auto b = a->self(); // цеплюсплюса сложная языка однака
}

roof ★★
()
Ответ на: комментарий от roof

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

И? Будет исключение, что является логичным и контролируемым поведением. Исключения для тебя слишком сложные? Хотя ты уже сам дал ответ.

Serral
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.