@larsmans के लिए एक है, इसलिए मैं वास्तव में digress होगा: यह कुछ बकवास कोड है!
यहां मुद्दा यह 3 गुना है:
- तुम बस प्रतिलिपि निर्माता (कुछ)
strcpy
बेहतर strncpy
द्वारा प्रतिस्थापित किया जा सकता है, जो कुछ बाध्य जाँच
- करता है के कोड दोहराया यह अपवाद सुरक्षित नहीं है
1) और 2) अधिक स्टाइलि हैं किसी भी चीज से चिपक गया, लेकिन 3) एक बड़ी चिंता है
संपादित करें: जैसा कि @ जेरी कॉफिन द्वारा इंगित किया गया है, यह स्वयं-असाइनमेंट के खिलाफ सुरक्षित नहीं है। ऐसा है कि sobj
और _string
वर्णों की एक ही सरणी पर इंगित करें, तो आप बड़ी परेशानी में हैं। इस पोस्ट के अंत में आसान समाधान भी इस स्थिति को शामिल करता है।
नहीं अपवाद सुरक्षित
के कोड, अर्थात् के एक हिस्से पर एक नजर है, else
हिस्सा:
_size = strlen(sobj);
delete[] _string;
_string = new char[ _size + 1 ];
strcpy(_string, sobj);
अगर, किसी कारण से, new
फेंकता है तो क्या होगा?
मुक्त कर दिया कर दिया गया है इसलिए केवल वस्तु के अनुपयोगी राज्य के (छमाही में छोड़ दिया है नहीं करने के लिए नए स्ट्रिंग के मूल्य
_string
अंक हैं नई वस्तु से अपने डेटा, वर्ष से आधा), लेकिन यह भी नष्ट नहीं किया जा सकता है (जब तक नाशक लीक ...?) जोड़ना अपवाद सुरक्षा, मुश्किल तरीके से
_size = strlen(sobj);
delete[] _string;
try {
_string = new char[ _size + 1 ];
} catch(...) {
_size = 0; _string = 0;
throw;
}
strcpy(_string, sobj);
ठीक है, यह वास्तव में नीचे-लाइन है, लेकिन यह हमें बेसिक अपवाद गारंटी लाता है: कोई कार्यात्मक गारंटी है, लेकिन एक गारंटी नहीं है कि कोड तकनीकी रूप से सही है (कोई दुर्घटना, कोई रिसाव)।
अपवाद सुरक्षा, आसान तरीका जोड़ना: कॉपी और स्वैप मुहावरा
में अधिक पूर्ण विवरण प्राप्त करें: What is the copy-and-swap idiom ?
void swap(String& lhs, String& rhs) {
using std::swap;
swap(lhs._size, rhs._size);
swap(lhs._string, rhs._string);
}
String& String::operator=(String other) { // pass-by-value
swap(*this, other);
return *this;
}
यह कैसे काम करता है?
- हम वास्तविक प्रतिलिपि
- हम आदान प्रदान मूल्यों के लिए स्वैप समारोह का पुन: उपयोग के लिए प्रति निर्माता का पुन: उपयोग
- हम सफाई
के लिए नाशक का पुन: उपयोग और यह से भी बेहतर है पिछले संस्करण भी, अब हमारे पास मजबूत अपवाद गारंटी है: यह लेन-देन है, इस प्रकार यदि यह विफल हो जाता है, तो हम जिस स्ट्रिंग को सौंपा गया है वह अपरिवर्तित है (जैसा कि कुछ नहीं हुआ था)।
More about Exception Guarantees।
मैं थोड़ा daunted कि एक सी ++ ट्यूटोरियल इस तरह के संदिग्ध कोड को बढ़ावा देने के हैं हूँ, प्रार्थना मुझे बताओ यह क्या नहीं करना है, इसका एक उदाहरण:/
ध्यान दें कि पुस्तक में प्रस्तुत के रूप में समाधान अपवाद सुरक्षित नहीं है (और ऐसा करने के लिए वास्तव में * सरल होगा, मैं वास्तव में समझ में नहीं आता कि उन्होंने क्यों नहीं किया)। –