C ++ - це все про власність на пам'ять - семантика власності .
Це зобов'язання власника шматка динамічно розподіленої пам'яті звільнити цю пам'ять. Тож справді стає питання, кому належить пам’ять.
У C ++ право власності задокументоване типом, який необроблений покажчик загорнутий всередину, таким чином, у хорошій програмі (ІМО) C ++ дуже рідко ( рідко , ніколи ) не бачити перероблених вказівників (так як сировинні покажчики не мають право власності, тому ми можемо не сказати, кому належить пам'ять, і, отже, уважно не читаючи документацію, ви не можете сказати, хто відповідає за право власності).
І навпаки, рідко можна побачити необроблені вказівники, що зберігаються в класі, кожен необроблений покажчик зберігається у власній обгортці інтелектуального вказівника. ( Примітка. Якщо ви не є власником об'єкта, ви не повинні його зберігати, оскільки ви не можете знати, коли він вийде за межі і буде знищений.)
Тож питання:
- На який тип семантичної форми власності стикаються люди?
- Які стандартні класи використовуються для реалізації цієї семантики?
- У яких ситуаціях ви вважаєте їх корисними?
Дозволяє зберігати 1 тип семантичної власності на відповідь, щоб за них можна було проголосувати вгору та вниз окремо.
Підсумок:
Концептуально розумні покажчики прості, а наївна реалізація проста. Я бачив багато спроб реалізації, але незмінно вони порушені якимось чином, що не очевидно для випадкового використання та прикладів. Тому я рекомендую завжди використовувати добре перевірені розумні покажчики з бібліотеки, а не прокачувати власні. std::auto_ptr
або один із розумних покажчиків Boost, здається, покриває всі мої потреби.
std::auto_ptr<T>
:
Одиничній особі належить об’єкт. Передача права власності дозволена.
Використання: це дозволяє визначати інтерфейси, які показують явну передачу права власності.
boost::scoped_ptr<T>
Одиничній особі належить об’єкт. Передача права власності НЕ дозволена.
Використання: використовується для показу явного права власності. Об'єкт буде знищений деструктором або після явного скидання.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Множинне право власності. Це простий посилальний лічильник покажчика. Коли число відліку досягає нуля, об'єкт руйнується.
Використання: Коли об’єкт може мати декілька власників із строком життя, який неможливо визначити під час компіляції.
boost::weak_ptr<T>
:
Використовується shared_ptr<T>
в ситуаціях, коли може відбуватися цикл покажчиків.
Використання: використовується для зупинки циклів утримування об'єктів, коли лише цикл підтримує спільну знижку.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Чи можна це перефразовувати? Я його зовсім не розумію.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. Покажчики RAW не мають семантики власності. Якщо ви не знаєте власника, ви не знаєте, хто несе відповідальність за видалення об'єкта. Існує кілька стандартних класів, які використовуються для загортання покажчиків (std :: shared_ptr, std :: unique_ptr тощо), які визначають право власності, і таким чином визначте, хто відповідає за видалення вказівника.