2012-03-22 17 views
5

は、私は私のvector<unsigned char>を取り、バックconst char *に変換ユニットテストクラスの小さなヘルパー関数を、開発しました。私はこれを書いたので、簡単な比較のためにgtestのASSERT_STREQマクロに渡すことができます。ここでは、次のとおりです。C++を返す関数のconstの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

戻る代わりにchar*malloc()、またはnew、不要)のstd::string

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コンテナを使用する必要があります - なしメモリリークを心配する必要があります。ところで

- あなたはC++を使用していると - ちょうどnewdeleteに固執します。

0

は私ものstd ::文字列を使用することをお勧めするつもりだったが、私は、なぜただ、ベクターの内容を比較していない、不思議でしたか?あなたができるようにするには、&source[0]を通じて生データにアクセスすることができます。

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

これを試しましたが、テストが失敗しました - 'ASSERT_STREQ(" de "、(const char *)&ret [0]);' - ベクタの最後にバイト0がないと思います。 –

+0

@MrChris:はい、私はそれを考えなかった – MikMik

2

過負荷operator==、その後、あなただけASSERT_EQ使用することができますよう

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); 

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(); 
関連する問題