2010-03-24 29 views
19

में std :: आवंटक का उपयोग कैसे करें मैं एक कंटेनर क्लास लिखने की कोशिश कर रहा हूं जो एसटीएल आवंटकों का उपयोग करता है। क्या मैं वर्तमान में कर एक निजी सदस्यअपने स्वयं के कंटेनर वर्ग

std::allocator<T> alloc_; 

(यह बाद में टेम्प्लेट की जाएगी ताकि उपयोगकर्ता एक अलग संभाजक चुन सकते हैं) के लिए और उसके बाद

T* ptr = alloc_.allocate(1,0); 

फोन एक नव करने के लिए एक सूचक प्राप्त करने के लिए है आवंटित 'टी' ऑब्जेक्ट (और कन्स्ट्रक्टर को कॉल करने के लिए alloc_.construct का उपयोग किया गया; नीचे जवाब देखें)। यह जीएनयू सी ++ लाइब्रेरी के साथ काम करता है।

हालांकि, सोलारिस पर एसटीएलपोर्ट के साथ, यह सही काम करने में विफल रहता है और विचित्र स्मृति भ्रष्टाचार त्रुटियों के सभी प्रकार की ओर जाता है। यदि मैं इसके बजाय

std::allocator_interface<std::allocator<T> > alloc_; 

तो यह सब काम कर रहा है जैसा कि यह करना चाहिए।

stl :: आवंटक का उपयोग करने का सही तरीका क्या है? एसटीएलपोर्ट/सोलारिस संस्करण जी ++ के साथ संकलित करने में विफल रहता है, लेकिन जी ++ सही है?

+7

मानक पुस्तकालय में 'allocator_interface' नामक कुछ भी नहीं है। – AraK

उत्तर

8

कुछ ऐसा जो आप करना चाहते हैं, उसका अपना कस्टम allocator है जिसका उपयोग आप यह देखने के लिए कर सकते हैं कि मानक कंटेनर बुद्धि आवंटकों को कैसे इंटरैक्ट करते हैं। स्टीफन टी। लववेज ने mallocator नामक एक अच्छा, सरल व्यक्ति पोस्ट किया। एक परीक्षण कार्यक्रम विभिन्न एसटीएल कंटेनरों का उपयोग करता है में डाल दें और आप आसानी से कैसे संभाजक मानक कंटेनर द्वारा किया जाता है देख सकते हैं:

नहीं mallocator में इंटरफ़ेस कार्यों के सभी (जैसे construct() और destroy()) ट्रेस आउटपुट के साथ वाद्य यंत्र हैं, इसलिए आप वहां आसानी से देखने के लिए ट्रेस कथन छोड़ना चाहेंगे कि मानक कंटेनर डिबगर का उपयोग किए बिना उन कार्यों का उपयोग कैसे कर सकते हैं।

इससे आपको एक अच्छा विचार देना चाहिए कि आपके कंटेनरों को कस्टम allocator का उपयोग करने की अपेक्षा की जा सकती है।

+0

दुर्भाग्यवश यह 'निर्माण' का पता नहीं लगाता है, वह वह कार्य है जो वह उपयोग करने में विफल रहा था: -/ –

+0

यह सच है (मैंने अपने उत्तर में कमी का उल्लेख किया है), और मैं अपने उत्तर का इरादा एक साइड-बार कम या कम होना चाहता था आपके उत्तर में जो समस्या को सीधे बताता है। लैववेज ने 'मॉलोकेटर' को एक कस्टम आवंटक के एक साधारण उदाहरण के रूप में पोस्ट किया। मैं प्रस्ताव दे रहा था कि कंटेनर आवंटकों का उपयोग करने के तरीके में अंतर्दृष्टि प्राप्त करने के लिए इसे एक आसान तरीका के रूप में भी इस्तेमाल किया जा सकता है, लेकिन उस उद्देश्य के लिए ट्रेसिंग में सुधार करने के लिए कुछ मामूली संशोधन करने की आवश्यकता हो सकती है। –

16

आपको आवंटन के साथ आवंटित और निर्माण करने की आवश्यकता है। इस तरह कुछ:

T* ptr = alloc_.allocate(1,0); 
alloc_.construct(ptr, value); 

यदि आप उचित ढंग से निर्मित वस्तु से शुरू नहीं करते हैं तो बहुत सी चीजें कम हो जाती हैं। एक std::string आवंटित किया गया है लेकिन निर्माण नहीं किया गया है। जब आप इसे असाइन करने का प्रयास करते हैं, तो यह पहले कुछ डेटा मुक्त करके अपनी पुरानी सामग्री को साफ़ करने का प्रयास करेगा, जो निश्चित रूप से ढेर और क्रैश से कचरे के मूल्य होंगे।

+0

हां, मुझे पता है, मैंने वास्तव में ऐसा किया है, हालांकि मैंने std :: allocator :: निर्माण (जो शायद अनुशंसित नहीं है इसलिए मैंने इसे अभी बदल दिया है) के बजाय प्लेसमेंट नया इस्तेमाल किया था। हालांकि, यह पता चला है कि STLPort 4.x std :: allocator :: के बारे में नहीं जानता है ... –

+0

यदि STLPort में 'std :: आवंटक नहीं है तो निर्माण करें तो यह टूटा हुआ है, इसका उपयोग भी परेशान मत करो। मैं आपको निश्चित रूप से बता सकता हूं कि 5.1.5 (मेरे द्वारा स्थापित संस्करण में यह है और यह ठीक काम करता है)। –

+1

मैंने अपनी जिज्ञासा को पूरा करने के लिए देखा, एसटीएलपोर्ट 4.x ** ** ** के पास उचित मानक अनुरूप 'std :: आवंटक' है। 4.6 में, 'निर्माण' फ़ंक्शन 'stlport/stl/_alloc.h' की लाइन 365 पर पाया जाता है।यदि यह काम नहीं कर रहा है, तो आपका इंस्टॉल सही नहीं है। –

संबंधित मुद्दे