संभव डुप्लिकेट:
मैं ऑब्जेक्ट टी की सरणी आवंटित करना चाहता हूं और ऑब्जेक्ट कन्स्ट्रक्टर का प्रयोग करके वस्तु को इनिशियलाइज़ करना चाहता हूं। सी ++
नया का उपयोग करना आसान है:
T * pointerT = new T [arraySize];
यह सभी
arraySize वस्तुओं के लिए टी कन्स्ट्रक्टर को कॉल करेगा हालांकि, किसी कारण के लिए मुझे नए के बजाय सी <कोड> मेम्मेलिन का उपयोग करना होगा इस मामले में मैं निम्नलिखित कोड का उपयोग करने के लिए समाप्त होता है
T * pointerT = (T *) memalign (64, arraySize * sizeof (T)); नया (पॉइंटर टी) टी ();
नया (पॉइंटर टी) टी () कॉल टी कन्स्ट्रक्टर केवल एक बार। हालांकि, मुझे सभी निर्माताओं के लिए टी कन्स्ट्रक्टर को केवल पहली बार कॉल करने की आवश्यकता नहीं है।
मैं आपकी मदद की सराहना करता हूं।
करो
नया (पॉइंटर टी) टी () एक पाश में। कृपया एक ऑब्जेक्ट के भीतर
pointerT रखें, जिसका नाशक ऑब्जेक्ट को नष्ट कर देता है और
फ्री कॉल करता है (जैसे यह कॉल करें।
aligned_vector ), और कन्स्ट्रक्टर में, करें:
ptrdiff_t k = 0; {For (; k & lt; n; k ++) नया (पॉइंटर टी + कश्मीर) टी () प्रयास करें; } पकड़ (...) {के लिए (; के & gt; 0; k--) (पॉइंटर टी + के) - & gt; ~ टी (); नि: शुल्क (pointerT); फेंकना; }
इस तरह, यदि कोई निर्माण विफल हो जाता है, तो आप लेन-देन को सुलझा सकते हैं और स्मृति या संसाधनों को रिसाव नहीं कर सकते।
इस उद्देश्य के लिए, पुन: प्रयोज्यता के संदर्भ में सबसे आसान होगा
std :: vector का उपयोग करें, जो आपके लिए अपवाद सुरक्षा (और कई अन्य उपहार) का ख्याल रखता है।
यहां एक नमूना आवंटन है, सी ++ 11, समय संरेखण विनिर्देश संकलित करें (कृपया संवर्द्धन और सुधार का सुझाव दें):
टेम्पलेट & lt; typename टी, आकार_टी संरेखित करें & gt; संरचना संरेखित_ऑलोकेटर {typedef T value_type; टाइपिंगफेड टी * पॉइंटर; टाइपएफ़ीफ़ कॉन्स्ट टी * कॉन्स्ट_ पॉइंटर; टाइपिंगफेड टी एंड amp; संदर्भ; टाइप-टोफ कॉन्स्ट टी एंड amp; const_reference; Typedef size_t size_type; Typedef ptrdiff_t अंतर_प्रकार; टेम्पलेट & lt; typename U & gt; संरचना रिबंड {typedef aligned_allocator & lt; यू, संरेखित करें & gt; अन्य; }; टी * पता (टी एंड amp; टी) {रिटर्न & amp; t; } टी * आवंटन (आकार _ टी एन, कॉन्स्ट टी * = 0) {यदि (टी * एएन = मेमलाइन (संरेखित करें, एन * आकार का (टी))) वापसी; Else std :: bad_alloc (); } टी * डीलोकेट (टी * पी, आकार_टी) {निशुल्क (पी); } Size_t max_size () const {रिटर्न आकार_टी (-लाइन) / आकार (टी); } टेम्पलेट & lt; typename यू, typename ... Args & gt; शून्य निर्माण (यू * पी, आरजीएस एंड एजी ... एजीआर) {:: नया ((शून्य *) पी यू (मानक :: अग्रेषित & lt; आरजीएस & gt; (आरजीएस) ...);} टेम्पलेट & lt; typename U & gt; नमूना उपयोग:
std :: vector & lt; T, aligned_allocator & lt; T, 64 & gt; शून्य नष्ट (यू * पी) {p- & gt; ~ यू ();}}
& Gt; वी (42); संरेखित भंडारण और 64 तत्वों के साथ एक वेक्टर का निर्माण करता है।
आप सी ++ 11 में भी कर सकते हैं
टेम्पलेट & lt ; टाइप करें नाम, टी, आकार_टी संरेखित करें gt; aligned_vector = std :: vector & lt; टी, aligned_allocator & lt; टी, संरेखित करें & gt;;
और अब आप उपयोग कर सकते हैं
< संकेन्द्रित भंडारण के साथ सदिश, सदिश, जागरूकता, रेंज-आधारित-के-पाश सचेत, इत्यादि।/ P>
Comments
Post a Comment