Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🔴 Advanced  ·  Lesson 61

Smart Pointers

Ownership, RAII और Smart Pointers

Pointer location बताता है; ownership बताता है resource को alive और release कौन रखेगा। Smart pointer type में dynamic ownership express करता और RAII से scope/return/exception पर cleanup करता है।

NeedRepresentation
Scoped objectValue
Dynamic sequencevector/string
Exclusive ownerunique_ptr
Shared lifetimeshared_ptr
Shared object observerweak_ptr
Ordinary non-ownerReference/documented pointer
पहले पूछें: क्या local value पर्याप्त है? Dynamic allocation automatic improvement नहीं। new/delete और RAII पढ़ें।

unique_ptr: Exclusive Ownership

auto score=std::make_unique<int>(95);
std::cout<<*score;
score.reset();

unique_ptr moveable लेकिन copyable नहीं। make_unique concise direct ownership देता है।

MemberUse
getRaw observation, ownership stays
* / ->Non-null object access
resetCurrent release, new own
releaseOwnership छोड़कर raw pointer
swapOwners exchange
boolNon-null test
release के returned pointer का new owner न बने तो leak होगा। unique_ptr<Base> से Derived destroy हो तो Base destructor virtual होना चाहिए।

Move और API Design

std::unique_ptr<Student> make_student(std::string n){
 return std::make_unique<Student>(std::move(n));
}
void enroll(std::unique_ptr<Student> student){ }
auto learner=make_student("Aman");
enroll(std::move(learner));
IntentType
Use onlyconst T&/T&
Optional non-ownerDocumented T*
Take ownershipunique_ptr by value
Reseat ownerunique_ptr&
Create ownerReturn unique_ptr

Function केवल object use करता है तो smart pointer parameter न लें। Move के बाद unique_ptr empty है; check/reassign के बिना dereference न करें।

shared_ptr और Control Block

auto course=std::make_shared<Course>("C++");
auto second_owner=course;
std::cout<<course.use_count(); // 2 here

Control block shared owners और weak observers track करता है। Last shared owner पर object destroy होता; weak observers रहने तक control block रह सकता है। Ordinary construction में make_shared prefer करें।

Widget* raw=new Widget;
std::shared_ptr<Widget> a(raw);
std::shared_ptr<Widget> b(raw); // गलत: two control blocks
One owner बनाकर उसी shared_ptr को copy करें।

use_count diagnostic है, synchronization rule नहीं। Control block safety pointed object को thread-safe नहीं बनाती। this से नया shared_ptr न बनाएं; जरूरत में enable_shared_from_this लें।

weak_ptr, lock और Cycles

auto owner=std::make_shared<int>(42);
std::weak_ptr<int> observer=owner;
if(auto temporary=observer.lock()) std::cout<<*temporary;
owner.reset();
if(observer.expired()) std::cout<<"Object ended";

weak_ptr object alive नहीं रखता। lock empty या temporary shared owner देता है। expired check के बाद अलग access की जगह lock करें।

struct Child;
struct Parent{std::shared_ptr<Child> child;};
struct Child{std::weak_ptr<Parent> parent;};

दोनों directions shared हों तो cycle cleanup रोक सकती है; back-link weak रखें।

Custom Deleters और Arrays

using File=std::unique_ptr<std::FILE,decltype(&std::fclose)>;
File file(std::fopen("report.txt","w"),&std::fclose);
if(!file){ /* failure */ }

auto data=std::make_unique<int[]>(100);
data[0]=7;

Deleter resource से match और non-throwing हो। Unique_ptr array specialization delete[]/indexing देता है, लेकिन ordinary sequence में size/iterators के कारण vector बेहतर है। PImpl में owner destructor उस जगह define करें जहां implementation type complete हो।

Complete Ownership Lab और Output

auto learner=std::make_unique<Student>("Aman");
std::cout<<"Owns before move: "<<bool(learner)<<'\n';
enroll(std::move(learner));
std::cout<<"Owns after move: "<<bool(learner)<<'\n';
auto score=std::make_shared<int>(42);
std::weak_ptr<int> observer=score;
if(auto locked=observer.lock()) std::cout<<*locked;
score.reset();
Created: Aman Owns before move: true Enrolled: Aman Destroyed: Aman Owns after move: false Owners: 1 Observed: 42 Expired: true

enroll parameter ने exclusive ownership लिया और scope end पर Student destroy हुआ। weak observer strong count नहीं बढ़ाता और sole owner reset पर expired हो गया।

Mistakes, Practice और Review

MistakeCorrection
shared_ptr defaultValue/unique prefer
unique_ptr copyIntentional move
One raw से two ownersOne owner copy/move
Shared cycleWeak back-link
Access के लिए shared paramReference/view
get pointer deleteOwner cleans
release then loseImmediate transfer
Pointee thread-safe assumeSeparate synchronization

Practice: Shape factory, shared Course, weak Parent–Child, FILE custom deleter और PImpl class बनाएं।

  1. Value possible?
  2. Exclusive/shared?
  3. Transfer visible?
  4. Borrow lifetime?
  5. Cycle?
  6. Deleter?
  7. Virtual destruction?
  8. Thread safety?

Authoritative संदर्भ

Ownership और API guidance current draft/Core Guidelines से verified है: default unique ownership और lifetime semantics में ही smart-pointer parameters।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

C++ smart pointer क्या है?
Standard smart pointer RAII object है जो dynamically allocated object का ownership express करता और ownership खत्म होने पर correct cleanup चलाता है। Main types unique_ptr, shared_ptr और weak_ptr हैं।
unique_ptr और shared_ptr में क्या अंतर है?
unique_ptr exclusive move-only ownership देता है। shared_ptr control block से shared ownership देता है; last shared owner खत्म होने पर managed object release होता है। Sharing जरूरी न हो तो unique_ptr लें।
unique_ptr copy क्यों नहीं होता?
Copy से दो exclusive owners बन जाते। Ownership std::move से explicitly transfer होता है और source empty हो जाता है।
weak_ptr कौन-सी problem solve करता है?
weak_ptr strong ownership count बढ़ाए बिना shared object observe करता है। यह shared_ptr cycles तोड़ता और lock() से temporary safe access देता है।
क्या हर raw pointer को smart pointer बनाना चाहिए?
नहीं। Smart pointer ownership express करता है। Clear lifetime वाले non-owning views के लिए raw pointer/reference ठीक हैं; owner/transfer/share में owning type लें।
← Back to C++ Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

अगला topicModern C++ Features आपकी प्रगति: 61 / 81 (75%) · Lesson 62 / 81 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें