विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

C++ और Rust डिस्ट्रक्टर तुलना

Rust में mem::forget ऑब्जेक्ट के डिस्ट्रक्शन को रोकने के लिए उपयोग होता है, यह क्लीनअप काम को छोड़ देता है और रिसोर्स की रिलीज़ किसी अन्य तंत्र पर छोड़ देता है।

उदाहरण के लिए:

let file = File::open("foo.txt").unwrap();
mem::forget(file);

तो C++ में डिस्ट्रक्शन कैसे रोकें? यानी डिस्ट्रक्टर को कैसे छोड़ें?

यह सेक्शन तीन तरीके बताएगा, पूरे कोड उदाहरण भी Knowledge Planet पर दिए गए हैं।

1. placement new

placement new हमें ऑब्जेक्ट के कंस्ट्रक्शन और डिस्ट्रक्शन को मैन्युअली मैनेज करने देता है। अगर हम ऑब्जेक्ट के डिस्ट्रक्टर को मैन्युअली कॉल न करें, तो हम ऑब्जेक्ट का डिस्ट्रक्शन छोड़ सकते हैं और इस तरह mem::forget जैसा प्रभाव पा सकते हैं।

उदाहरण के लिए:

alignas(Foo) std::byte storage[sizeof(Foo)];  // 分配对齐的原始内存块
Foo* pfoo = new (storage) Foo();  // 在这块内存上构造Foo对象

उपरोक्त कोड में, placement new से pfoo ऑब्जेक्ट बनता है, लेकिन हम डिस्ट्रक्टर कॉल नहीं करते, इस तरह ऑब्जेक्ट की क्लीनअप लॉजिक छोड़ी जा सकती है।

2. स्मार्ट पॉइंटर के कस्टम डिलीटर का उपयोग

इसी तरह की सुविधा पाने का दूसरा तरीका है स्मार्ट पॉइंटर के डिलीटर को कस्टमाइज़ करके ऑब्जेक्ट के नष्ट होने से रोकना। हम एक ऐसा डिलीटर परिभाषित कर सकते हैं जो कुछ भी न करे, और इस तरह डिस्ट्रक्टर के कॉल से बचा जा सकता है।

std::unique_ptr<Foo, NoOpDeleter> pfoo(new Foo(), NoOpDeleter{});

कस्टम डिलीटर NoOpDeleter का उपयोग करके हम std::unique_ptr को स्कोप छोड़ने पर डिस्ट्रक्टर कॉल करने से रोक सकते हैं, और इस तरह mem::forget जैसा प्रभाव पा सकते हैं।

3.union

union का तरीका बहुत दिलचस्प है, क्या आप इसका सिद्धांत जानते हैं? चर्चा के लिए कमेंट सेक्शन में जुड़ें~

template <class T>
union Wrapper {
  T value;
  ~Wrapper() {}
};

struct Foo {
  ~Foo() { std::cout << "dtor foo\n"; }
};

Wrapper<Foo> f; 
// f.value.~Foo);  必须手动调用

संबंधित विषय

टिप्पणियाँ