0
typedef struct  value 
{
    char* contents;
    int size;
}Value;

hash_map<Key,list<Value>,hash<Key>,eqKey> dspace;
list<Value> vallist;

.

Value変数を作成してこのリストに追加するたびに私がしていること 。

ポインターがあり、Value * ptrこのポインターを使用してリストのメンバーを指し、最後にリストからメンバーを消去しています。

これで、ポインターを使用して値にアクセスできますが、リスト反復子を使用することはできません。

2つの質問があります

  1. リストから要素を消去しますが、割り当てられたメモリは変更されないか、メモリも解放されます。
  2. このptrを使用してメモリを解放することは可能ですか? または、リストの他のメンバーにptrを設定すると、前のメンバーが占有していたメモリが解放されるかどうかが決まります。
4

3 に答える 3

0

ハッシュマップから要素を削除するために呼び出すdspace.erase()と、使用されているメモリが解放されます。これは、メモリが他の用途に使用できるようになったことを意味します。そのメモリブロック内のデータが消去されるという意味ではありません。ポインタを介してデータにアクセスしようとすると、メモリがまだ無傷であるように見える場合があります。これが、メモリが解放されたかどうかを尋ねている理由である可能性があります。ただし、ポインタが指すメモリはいつでも再利用される可能性があるため、これを行うと未定義の動作が発生します。

于 2012-07-21T21:19:11.017 に答える
0
  1. 要素は存在しなくなります。要素がポインターであった場合、ポインターは存在しなくなりますが、ポインターが指していたオブジェクトは影響を受けません。ただし、要素自体はなくなりました。そうしないと、リストを使用するのが非常に困難になります。

  2. ポインターで何をしても、リストにはまったく影響しません。オブジェクトへの最後のポインターが破棄されたときにのみオブジェクトが破棄されるようにオブジェクトを存続させるポインターが必要な場合は、それらを使用できます。(ブーストのshared_ptrなど。)

于 2012-07-21T21:12:31.157 に答える
0
  1. リストからインスタンスを削除するValueと、割り当てられたメモリが解放されます。
  2. 通常は呼び出しますdelete ptr;が、インスタンスのメモリが既に解放されているため、これは機能しません。通常のポインターの値を変更しても、メモリ割り当てにはまったく影響しません。

あなたValueにはchar *contentsメンバーがいます。インスタンスが削除されると、それが指しているメモリがリークする可能性がありValueます - 割り当て方法によっては。代わりに std::string の使用を検討する必要があります。

于 2012-07-21T21:23:04.063 に答える