आप एक "अमान्य" इटरेटर के बारे में सोच रहे हैं, जो केवल एक ही है जो उपयोग किए जाने पर दुर्घटना को उकसाएगा, लेकिन मानक की परिभाषा व्यापक है। इसमें संभावना है कि इटरेटर अभी भी सुरक्षित रूप से अव्यवस्थित हो सकता है, लेकिन उस तत्व को इंगित नहीं करता है जिस पर यह इंगित करने की उम्मीद है। (यह अवलोकन का एक विशेष मामला है कि "अपरिभाषित व्यवहार" का अर्थ है "आपका प्रोग्राम तुरंत क्रैश हो जाएगा"; इसका अर्थ यह भी हो सकता है कि "आपका प्रोग्राम चुपचाप गलत परिणाम की गणना करेगा" या यहां तक कि "कुछ भी गलत नहीं होगा इस कार्यान्वयन ")
यह प्रदर्शित करने के लिए कारण है कि इस erase
साथ कोई समस्या है आसान है:।
#include <vector>
#include <iostream>
int main(void)
{
std::vector<int> a { 0, 1, 2, 3, 4, 4, 6 };
for (auto p = a.begin(); p != a.end(); p++) // THIS IS WRONG
if (*p == 4)
a.erase(p);
for (auto p = a.begin(); p != a.end(); p++)
std::cout << ' ' << *p;
std::cout << '\n';
}
सी के ++ इस कार्यक्रम क्रैश नहीं करेंगे ठेठ कार्यान्वयन पर, लेकिन यह 0 1 2 3 4 6
प्रिंट के बजाय होगा 0 1 2 3 6
संभवतः इरादा है, क्योंकि एफ को मिटा रहा है irst 4
p
अमान्य 4
पर इसे आगे बढ़ाकर।
आपके सी ++ कार्यान्वयन में एक विशेष "डीबगिंग" मोड हो सकता है जिसमें यह प्रोग्राम क्रैश होने पर क्रैश करता है। उदाहरण के लिए, जीसीसी 4 के साथ।8:
$ g++ -std=c++11 -W -Wall test.cc && ./a.out
0 1 2 3 4 6
लेकिन
$ g++ -std=c++11 -W -Wall -D_GLIBCXX_DEBUG test.cc && ./a.out
/usr/include/c++/4.8/debug/safe_iterator.h:307:error: attempt to increment
a singular iterator.
Objects involved in the operation:
iterator "this" @ 0x0x7fff5d659470 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPiNSt9__cxx19986vectorIiSaIiEEEEENSt7__debug6vectorIiS6_EEEE (mutable iterator);
state = singular;
references sequence with type `NSt7__debug6vectorIiSaIiEEE' @ 0x0x7fff5d659470
}
Aborted
समझते हो कि कार्यक्रम अपरिभाषित व्यवहार किसी भी तरह से भड़काती। यह सिर्फ इतना है कि अपरिभाषित व्यवहार के परिणाम डीबगिंग मोड में अधिक नाटकीय हैं।
आप कहते हैं कि सी ++ मानक डीरफ्रेंसिंग द्वारा ऐसे इटरेटर को अपरिभाषित व्यवहार नहीं होता है? –
@ TobiasBrüll no, C++ मानक द्वारा यह अपरिभाषित (सी ++ मानक द्वारा) व्यवहार का कारण बनता है। सबसे आम अपरिभाषित व्यवहार, यदि क्षमता नहीं बदली जाती है, तो यह है कि आपको वह तत्व मिलता है जो अब आपके ऑफरेटर को वास्तविक अभ्यास में संदर्भित करता है। लेकिन "पुनरावृत्तियों जो वे संदर्भित करते हैं उन्हें बदलते हैं" के बारे में कचरा जोड़ने के बजाय, जो कार्यान्वित किया जाता है और जो मानक को पढ़ने के लिए कठिन बनाते हैं (हे), वे मूल रूप से कहते हैं कि इटरेटर हमेशा एक ही चीज़ का संदर्भ लेते हैं, या अमान्य हो जाते हैं। इस सिद्धांत के सिद्धांत में एक संकलक ऐसा अनुकूलन कर सकता है। – Yakk
@ TobiasBrüll: नहीं, यह अभी भी अपरिभाषित व्यवहार है। इसका मतलब यह नहीं है कि आपको दुर्घटना हो रही है। –