तीन का नियम एक अपवाद सेफकोड बनाने के लिए अंगूठे के नियमों के तहत सी ++ के नियमों में से एक है। ये नियम निर्धारित करते हैं कि अपवाद मुक्त अभ्यास के लिए कक्षा के डिफ़ॉल्ट सदस्यों का उपयोग कैसे किया जाना चाहिए।
थ्री के नियम को बिग थ्री या द बिग थ्री के नियम के रूप में भी जाना जाता है और वर्ग के लिए निर्धारित करता है कि, यदि कोई वर्ग उल्लेखित तीनों में से किसी को परिभाषित करता है तो उसे संभवतः तीनों को स्पष्ट रूप से परिभाषित करना चाहिए -
- विनाशक
- कॉपी कंस्ट्रक्टर
- असाइनमेंट कंस्ट्रक्टर कॉपी करें
ये तीनों वर्ग के विशेष सदस्य कार्य हैं। यदि उनमें से कोई भी प्रोग्रामर द्वारा स्पष्ट रूप से परिभाषित नहीं किया गया है, तो संकलक निहित संस्करण प्रदान करता है। यदि उपरोक्त में से किसी एक को स्पष्ट रूप से परिभाषित किया गया है, तो इसका अर्थ है कि अन्य दो के लिए निहित संस्करण अनुचित होना चाहिए और उन्हें फिर से परिभाषित किया जाना चाहिए।
ऐसा इसलिए होता है क्योंकि अंतर्निहित रूप से जेनरेट किए गए कंस्ट्रक्टर और असाइनमेंट ऑपरेटर्स डेटा सदस्यों की उथल-पुथल करते हैं। जब क्लास में डायनेमिक रूप से आवंटित संसाधनों की ओर इशारा करते हुए पॉइंटर्स होते हैं, तो हमें डीप कॉपी की आवश्यकता होती है।
डिफ़ॉल्ट विनाशक अप्रयुक्त वस्तुओं को हटा देते हैं। जब कोई कॉपी कंस्ट्रक्टर परिभाषित नहीं होता है, तो डिस्ट्रक्टर दो बार चलेगा, एक बार उन वस्तुओं के लिए जिनमें कॉपी होती है और दूसरी उन वस्तुओं के लिए जिनसे डेटा सदस्यों की प्रतिलिपि बनाई जाती है। इससे बचने के लिए स्पष्ट परिभाषा आवश्यक हो जाती है।
आइए एक उदाहरण से समझते हैं जहां कोई कॉपी कंस्ट्रक्टर नहीं है और कोई कॉपी असाइनमेंट ऑपरेटर नहीं है, लेकिन डिस्ट्रक्टर मौजूद है -
उदाहरण
#include <stdio.h> class Numbers{ private: int num; int* ptr; public: Numbers( int n, int* p ) //copy constructor{ num =n ; ptr = new int[ num ]; } ~Numbers() //destructor{ delete ptr; ptr = NULL; } }; int main(){ int arr[ 4 ] = { 11, 22, 33, 44 }; Numbers Num1( 4, arr ); // this creates problem Numbers Num2( Num1 ); return 0; }
आउटपुट
*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001f46c20 *** Aborted
-
ऐसा इसलिए हुआ क्योंकि कार्यक्रम के दायरे से बाहर होने पर विध्वंसक को दो बार बुलाया जाता है। पहले Num1 को हटाना और फिर Num2 के लिए। डिफॉल्ट कॉपी कंस्ट्रक्टर पॉइंटर पीटीआर की एक कॉपी बनाता है लेकिन इसके लिए मेमोरी आवंटित नहीं करता है। इसलिए, जब Num1 को हटा दिया जाता है तो बाद के ptrs प्रोग्राम को क्रैश कर देते हैं।