2012-02-10 9 views
4

私はchar配列を割り当ててから文字列として返す必要がありますが、このchar配列をコピーしてメモリを解放したくありません。char配列をstd :: stringに入れる方法

 char* value = new char[required]; 
     f(name, required, value, NULL); // fill the array 
     strResult->assign(value, required); 
     delete [] value; 

私は上記のようにしたくありません。配列をstd文字列コンテナに置く必要があります。私はそれをどのようにすることができますか?

EDIT1:

私はすべきではなく、文字列が、この目的のために設計されていないということを理解していました。 MB誰かが私がそれを行うことができるchar配列の別のコンテナ実装を知っていますか?

+0

"* MB誰かが私がそれを行うことができるchar配列の別のコンテナ実装を知っていますか?*" 'std :: vector ' ... – ildjarn

答えて

2

あなたはしないでください。 std::stringsは、内部データを公開してバッファとして使用するようには設計されていませんでした。
外部関数の実行中に文字列のバッファアドレスが変更されないことは保証されていません。特に、関数がメモリ自体を割り当てたり割り当てを解除する場合は変わりません。
文字列のバッファが連続しているとは限りません。

たとえば、hereを参照してください。

あなたの投稿の例がこれを行うより良い方法です。

+0

+1 for 'should not' –

3

代わりの関数にvalueを渡し、sが正しい長さのstd::stringであり、&s[0]を渡します。

+0

'required'ではなく' value'を意味します。しかし、それは動作しません。 std :: stringのバッファは読み取り専用です。 –

+0

+1ですが、_value_を関数に渡すのではなく、あなたが意味すると思います。 – rasmus

+0

@MrLister constとして宣言されていない限り、文字列は読み取り専用ではありません。 &s [0]からchar *への変換は問題ありません。 – rasmus

0

文字列にコピーする必要があります。 AFAIK std :: stringは、内部のディレクトリにアクセスすることはできません。あらゆる種類のアドレスベースの直接割り当てを行います。 C++ 11では

std::string s(charArry); 
5

、以下が動作することが保証されています

が動作するを保証していないが、それは Library Issue 530た最も標準ライブラリによって対処されたC++ 03では
std::string strResult(required, '\0'); 
f(name, required, &strResult[0], NULL); 

// optionally, to remove the extraneous trailing NUL (assuming f NUL-terminates): 
strResult.pop_back(); 

return strResult; 

実装は何年も実装されていたので、おそらくですが、最終的に実装に依存します。

+0

それは動作しません私はそれをしたとき私のアプリケーションから致命的なエラーが発生しました。 – itun

+1

@itun:私が言及した非C++ 11実装のうちの1つを使用していることは明らかです。 ; - ] – ildjarn

+0

私はC++ 11サポートフラグなしで最後のMinGWを使用することを知っています。 – itun

関連する問題