2

私は始めており、ポインターで理解できないことがあります。理由がわからないエラーを返す次のコードがあります。

std::string key = "myKey";    
const unsigned char* aesKey = reinterpret_cast<const unsigned char *> (key.c_str());

// Executing some stuffs

delete aesKey;

コードが最初に実行されたときはすべて正常に動作しますが、2 回目にはエラーが発生しますが、行がない場合は発生しませんdelete(代わりに、メモリ リークが発生し、最悪です)。

なぜこれが機能しないのか、誰かが説明してくれますか?

以下のサンプルは、同じコンテキスト (同じ方法など) で正常に動作しています。

unsigned char* test = new char;
//doing some stuff
delete test;
4

5 に答える 5

7

まず、あなたはそのC文字列を所有していないので、あなたのものではありませんdelete[]。まだそれstd::stringを所有していて、delete[]後でそれをします。

2番目:配列は。delete[]ではなく、で削除されますdelete。とにかく間違った演算子を使用しています。

于 2012-06-20T12:32:46.363 に答える
2

によって返されるメモリはstd::string::c_str引き続き文字列によって所有されるため、deletedであってはなりません。

eddeleteしたメモリのみを呼び出す必要があり、を使用しないでください。newnew

于 2012-06-20T12:32:37.907 に答える
1

から受信したデータは削除しないでくださいc_str()。文字列の内部の場所を指し、それを削除するのは文字列次第です

于 2012-06-20T12:33:03.507 に答える
1

経由で返されたポインターを削除することは想定されていませんstd::string::c_str()。覚えておくべき経験則は次のとおりです。ポインターにメモリを割り当てていない場合は、割り当てを解除しないでください。標準を参照してください。

21.4.7.1 basic_string アクセサー

 const charT* c_str() const noexcept;
 const charT* data() const noexcept;

1戻り値: [0,size()] 内の各 i に対して p + i == &operator となるようなポインター p。

2複雑さ: 一定時間。

3必須: プログラムは、文字配列に格納されている値を変更してはなりません。

于 2012-06-20T12:34:33.520 に答える
0

いくつかの簡単なメモ:

最初の例では、割り当てていないメモリを削除しています。の内容はaesKey文字列に属しており、keyそれらを削除するべきではありません...それ以外の場合key、スコープ外に出たときに が破棄されると、同じメモリブロックを削除しようとし、厄介な二重削除バグが発生します.

2 番目の例では、 を作成してcharいますが、 に割り当てていunsigned charます。これは、特により複雑なデータ型を操作する場合にはお勧めできません。

于 2012-06-20T12:34:39.127 に答える