2012-03-22 25 views
5

मैंने यूनिट टेस्ट क्लास के लिए एक छोटा सा सहायक फ़ंक्शन विकसित किया है, जो मेरा vector<unsigned char> लेता है और इसे const char * में परिवर्तित करता है। मैंने इसे लिखा है इसलिए मैं इसे सरल तुलना के लिए gtest's ASSERT_STREQ मैक्रो में पास कर सकता हूं। संदेश यह है:सी ++ फ़ंक्शन रिटर्निंग कॉन्स char *

const char * convertVecToChar(std::vector<unsigned char>& source) 
{ 
    std::vector<unsigned char>::size_type size = source.size(); 
    char* data = (char*)malloc(sizeof(char) * (size + 1)); 
    memcpy(data, &source[0], size); 
    data[size] = 0; 
    return data; 
} 

और यहाँ की यह कहा जा रहा है एक उदाहरण है:

ASSERT_STREQ("de", convertVecToChar(somevector)); 

मुझे लगता है यह तथापि टपकाया है के रूप में मैं malloc फोन कर रहा हूँ, लेकिन सड़क के नीचे आगे delete बुला बिना?

क्या ऐसा करने के लिए एक और अधिक शानदार तरीका है, जिसमें एक परीक्षण विधि के भीतर ASSERT_STREQ पर कॉल करने के लिए अलग-अलग const char * परिवर्तनीय बनाने में शामिल नहीं है?

सभी प्रतिक्रियाओं के लिए अग्रिम में बड़ा धन्यवाद।

क्रिस

+1

उपयोग 'मुक्त()' 'malloc के बाद()', नहीं 'delete'। एक दिलचस्प सवाल के लिए – hmjd

+0

+1। हालांकि, मेरे पास वास्तव में कोई जवाब नहीं है। यह यूनिट परीक्षण के लिए सिर्फ एक विशाल हैक की तरह लगता है। क्या आपने 'ASSERT_VECEQ' बनाने पर विचार किया था? इसके अलावा, शायद आपको यूनिट परीक्षणों में मेमोरी लीक के लिए बहुत ज्यादा परवाह नहीं करना चाहिए। –

+0

ठीक है, मुझे बताने के लिए धन्यवाद। –

उत्तर

11

वापसी के बजाय एक std::string एक char* (malloc(), या new, अनावश्यक):

std::string convertVecToChar(std::vector<unsigned char>& source) 
{ 
    return std::string(source.begin(), source.end()); 
} 

और उपयोग:

ASSERT_STREQ("de", convertVecToChar(somevector).c_str()); 
+1

यह सामान्य ज्ञान दृष्टिकोण प्रतीत होता है :) धन्यवाद! –

1

तुम बस string कंटेनर का उपयोग करना चाहिए - कोई मेमोरी लीक के बारे में चिंता करने की ज़रूरत है।

बीटीडब्ल्यू - जैसा कि आप सी ++ का उपयोग कर रहे हैं - बस new और delete पर चिपके रहें।

0

मैं भी std :: स्ट्रिंग का उपयोग करने की सिफारिश करने जा रहा था, लेकिन मैं सोच रहा था, क्यों न केवल वेक्टर की सामग्री की तुलना करें? आप &source[0] के माध्यम से कच्चे डेटा का उपयोग कर सकते हैं, ताकि आप कर सकता है:

bool operator==(const char* nullTerminatedChars, 
       const std::vector<char>& vecChars) 
{ 
    return std::string(nullTerminatedChars) == 
      std::string(vecChars.begin(), vecChars.end()); 
} 

के रूप में प्रयोग करें:

std::vector<char> chars; 
ASSERT_EQ("de", chars); 

आप

ASSERT_STREQ("de", (char*)&source[0]); 
+1

ने कोशिश की, लेकिन परीक्षण विफल रहा - 'ASSERT_STREQ ("डी", (कॉन्स char *) और ret [0]);' - ऐसा लगता है क्योंकि वेक्टर के अंत में कोई बाइट 0 नहीं है। –

+0

@MrChris: हाँ, मैंने सोचा नहीं था कि – MikMik

2

अधिभार operator==, तो आप सिर्फ ASSERT_EQ उपयोग कर सकते हैं operator<<(std::ostream& ... भी अधिभारित करने की आवश्यकता होगी, क्योंकि GoogleTest तर्कों को विफल करने पर तर्क संदेशों को कन्वर्ट करने के लिए तर्कों को परिवर्तित करने के लिए उपयोग करता है।

संपादित करें:

std::ostream& operator<<(std::ostream& os, const std::vector<char>& chars) 
{ 
    return os << std::string(chars.begin(), chars.end()); 
} 
+0

मुझे यह पसंद है - बहुत सुरुचिपूर्ण लग रहा है। लेकिन ओवरलोड को सही ढंग से कार्यान्वित करने के तरीके पर कुछ होमवर्क की आवश्यकता होगी! (अभी भी इस सामान पर एक n00b का थोड़ा सा)। सलाह के लिये धन्यवाद। –

1
source.push_back(0); 
ASSERT_STREQ("de", (char*)&source[0]); 
source.pop_back(); 
संबंधित मुद्दे