मान लीजिए मेरे पास निम्न कोड है:
int * intPtr = new int [5] ; // ... काम करते हैं ...
और अब मैं एक नया, समान, सरणी में intPtr कॉपी करना चाहता हूं:
int * NewIntPtr = नया इंट [5];
यह या तो एक सरल लूप या std :: copy () का उपयोग करके किया जा सकता है:
-
लूप के लिए एक का उपयोग करना
<प्री>के लिए (इंट आई = 0; आई & lt; 5; i ++) * (न्यूआईंटप्रट्र + i) = * (इंटपीट्र + आई);
-
std :: copy () का उपयोग
std :: copy (intPtr, intPtr + 5, newIntPtr);
std :: copy () का उपयोग करते हुए, मुझे दृश्य स्टूडियो में एक चेतावनी मिलती है:
चेतावनी C4996 : 'Std :: _ Copy_impl': असुरक्षित हो सकता है पैरामीटर के साथ फ़ंक्शन कॉल ...
हो सकता है stdext :: checked_array_iterator & lt का उपयोग करें ; Int * & gt;
चेतावनी को दूर करने के लिए:
std :: copy (intPtr, intPtr + 5, stdext :: checked_array_iterator & lt; int * & gt; (newIntPtr, 5 ));
लेकिन इसका मतलब है कि कोड विज़ुअल स्टूडियो के अलावा कुछ भी नहीं संकलित करेगा।
तो, मैं इसे कैसे हल करूं? क्या मैं लूप के लिए सरल उपयोग करना चाहिए और प्रभावी रूप से चेतावनी से बचने के लिए, या मुझे std :: copy () का उपयोग करना चाहिए और चेतावनी से बचने के लिए कुछ करना चाहिए? जाहिर है, मैं चेतावनी को निष्क्रिय कर सकता हूं, लेकिन यह उचित समाधान की तरह नहीं लगता ... या क्या?
एक पाश पर std :: copy
का उपयोग करने के कुछ फायदे हैं:
- कॉल स्वयं दस्तावेज़िंग है आपकी कॉल का एक पाठक तुरंत जानता है कि टिप्पणियां पढ़ने के बिना बयान के इरादे का क्या मतलब था या यह पता लगाया जा रहा है कि पाश क्या कर रहा है
- यह आपकी तरह सरल प्रकारों के लिए अनुकूलित हो सकता है:
व्यवहार में, std :: copy के कार्यान्वयन से कई असाइनमेंट से बचें और थोक कॉपी फ़ंक्शन जैसे std :: memmove का उपयोग करें यदि मूल्य प्रकार ट्रिविलीकापीबल है
- अधिक रख-रखाव भविष्य में आपका कंटेनर अधिक आसानी से बदली जा सकता है आपको केवल कॉपी करने के लिए मानकों को बदलने की जरूरत नहीं है
जैसा कि अन्य टिप्पणियों का उल्लेख है, दोनों, लूप और कॉपी कॉल समान रूप से असुरक्षित हैं ताकि चेतावनी भ्रामक हो रही हो। हालांकि, मैं पूरे एप्लिकेशन के लिए सुरक्षा चेतावनियों को अक्षम करने से बचना चाहूंगा। इसके बजाय, स्थानीय रूप से #pragma अक्षम
No comments:
Post a Comment