2012-12-10 4 views
5

अगर मैं कोड है कि आम तौर पर इस तरह कार्य होता है:ओपनजीएल में एक साझा_पीआरआर पास करें?

char* log = new char[logLength]; 
glGetProgramInfoLog(..., ..., log) 
//Print Log 
delete [] log; 

मैं एक सी ++ 11 स्मार्ट सूचक के साथ एक ही परिणाम कैसे प्राप्त कर सकता है? कौन जानता है कि मुझे उस स्मृति को हटाने का मौका मिलने से पहले क्या हो सकता है।

तो मुझे लगता है कि मुझे सी शैली सूचक को डाउनकास्ट करने की आवश्यकता है?

+0

माध्यम से स्मार्ट संकेत दिए गए एक सी ++ 11 अनन्य नहीं हैं ... – user1797612

+0

यह आपके सवाल का जवाब नहीं है, लेकिन मैं बस के रूप में एक 'वेक्टर ' का प्रयोग करेंगे [इस उदाहरण] (https: //github.com/progschj/OpenGL-Examples/blob/master/01shader_vbo1.cpp#L49)। –

उत्तर

5

यदि आपका कोड वास्तव में आपके स्निपेट में दिखता है, तो shared_ptr स्थिति के लिए एक ओवरकिल है, क्योंकि ऐसा लगता है कि आपको आवंटित स्मृति के साझा स्वामित्व की आवश्यकता नहीं है। unique_ptr में एरे के लिए आंशिक विशेषज्ञता है जो इस तरह के उपयोग के मामलों के लिए एकदम सही फिट है। जब यह गुंजाइश से बाहर हो जाता है तो यह प्रबंधित पॉइंटर पर delete[] पर कॉल करेगा।

{ 
    std::unique_ptr<char[]> log(new char[logLength]); 
    glGetProgramInfoLog(..., ..., log.get()); 
    //Print Log 
} // allocated memory is released since log went out of scope 
3

std::shared_ptr में एक विधि get है जिसका उपयोग आप चर के लिए सी स्टाइल पॉइंटर प्राप्त करने के लिए कर सकते हैं। यदि वह सूचक std::string पर है, तो आपको सी शैली स्ट्रिंग के लिए पॉइंटर प्राप्त करने के लिए c_str() फ़ंक्शन को और कॉल करने की आवश्यकता है।

संपादित करें: मुझे लगता है कि फ़ंक्शन पढ़ने के विरोध में स्ट्रिंग को लिख रहा है। आपको पहले std :: स्ट्रिंग का आकार बदलना होगा, और इसके बाद भी, the pointer returned by c_str isnt meant for writing। std :: shared_ptr हालांकि काम करना चाहिए।

+0

लेखन के लिए आप str [0] का उपयोग कर सकते हैं। सी ++ 11 में यह काम करने के लिए गारेट किया गया है (मानक को आवंटित आवंटित भंडारण की आवश्यकता है) – milleniumbug

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