5

関数にchar*が必要な場合、shared_ptrを渡すことができますか?

テキストファイル全体(長さ= 100)を読み込んでいて、charをchar[]配列に格納したいと思います。私が使用した素朴な方法はこれでした:

ifstream dictFile(fileName);
size_t fileLength = 100;
char* readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer, fileLength);
//processing readInBuffuer..............
delete[] readInBuffer;
dictFile.close();

もちろん、delete []ステートメントの前に例外がスローされると、メモリリークが発生します。shared_ptr readInBuffer(new char [fileLength]);を使用できるかどうか疑問に思っています。しかし、関数プロトタイプ

読み取り(char * s、streamsize n)

スマートポインタを入力として受け入れませんか?トリックはありますか?

編集:私はこのようなものを書き込もうとしています:

shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);

ただし、コンパイルされません。

4

3 に答える 3

6

ポインタを使用する代わりに、ベクトルを使用できます。

std::vector<char> readInBuffer(fileLength);
dictFile.read(&readInBuffer[0], fileLength);
于 2012-11-15T19:59:58.183 に答える
5

大きな脂肪の警告std::shared_ptr<char>配列を指すを作成すると、未定義の動作が引き起こされます。これは、スマートポインターがdeleteポインターではなく、ポインターになるdelete[]ためです。std::shared_ptr<char[]>代わりに使用してください!

有用な警告として役立つ可能性があるため、これをここに残しておきます。元の答えは次のとおりです...

このget()関数は、基になる生のポインターを返します。あなたはすでにこれをあなたのコードに書いています!

shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);

を使用しても同じ結果を得ることができます&*readInBuffer

もちろん、それがポインタでdictFile.read()はないことを確認する必要があります。そうしないdeleteと、悪魔が鼻から飛び出す可能性があります。

于 2012-11-15T20:03:21.907 に答える
1

いいえ、を渡すことはできませんshared_ptr。ただし、1つ作成し、そのget()メンバー関数を呼び出して、関数に渡す生のポインターのコピーを取得することはできます。ただし、ashared_ptrは配列を扱いません。それvectorが目的です。ただしunique_ptr、配列にaを使用して、そのオブジェクトを管理できます。

std::unique_ptr<char[], std::default_delete<char[]> ptr(new char[whatever]);
f(ptr.get());

その最初の行を書くためのより短い方法があるかもしれませんが、私はそれを掘り下げる時間がありません。

于 2012-11-15T20:06:01.530 に答える