अंतिम अद्यतन:2026-10-12
C++ और Rust डिस्ट्रक्टर तुलना¶
Rust में mem::forget ऑब्जेक्ट के डिस्ट्रक्शन को रोकने के लिए उपयोग होता है, यह क्लीनअप काम को छोड़ देता है और रिसोर्स की रिलीज़ किसी अन्य तंत्र पर छोड़ देता है।
उदाहरण के लिए:
तो 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. स्मार्ट पॉइंटर के कस्टम डिलीटर का उपयोग¶
इसी तरह की सुविधा पाने का दूसरा तरीका है स्मार्ट पॉइंटर के डिलीटर को कस्टमाइज़ करके ऑब्जेक्ट के नष्ट होने से रोकना। हम एक ऐसा डिलीटर परिभाषित कर सकते हैं जो कुछ भी न करे, और इस तरह डिस्ट्रक्टर के कॉल से बचा जा सकता है।
कस्टम डिलीटर 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); 必须手动调用
संबंधित विषय¶
- C++ प्योर वर्चुअल फ़ंक्शन और एब्स्ट्रैक्ट क्लास | C++那些事
- C++ assert | C++那些事
- C++ bit-field | C++那些事
- C भाषा से C++ पॉलीमॉर्फ़िज़्म | C++那些事
- C++ const constant और qualifier | C++那些事
- C++ const परिवार | C++那些事
- C++ dereference ऑपरेटर * | C++那些事
- C++ इनिशियलाइज़ेशन और असाइनमेंट | C++那些事
- C++ multiple return values लिखने के तरीके | C++那些事
- C++ mutable कीवर्ड | C++那些事