(C ++)list.error方法并使用指针删除内存

时间:2012-07-21 20:49:18

标签: c++ list pointers erase

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

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

每次创建Value变量并添加到此列表时我正在做什么。

我有一个指针Value * ptr,我使用这个指针指向列表的成员,最后我从列表中删除该成员。

现在我可以使用指针访问该值但不使用列表迭代器。

我有两个问题

  1. 擦除从列表中删除元素,但分配的内存保持不变或内存也被释放。
  2. 是否可以使用此ptr释放内存。或者如果我将ptr设置为列表中的其他成员,那么前一个成员占用的内存将被释放。

3 个答案:

答案 0 :(得分:0)

  1. 该元素不复存在。如果元素是指针,则指针停止存在,但它指向的对象不受影响。然而,元素本身已经消失。否则,列表将非常难以使用。

  2. 使用指针执行的操作根本不会对列表产生任何影响。如果你想要指针,那么保持对象活着,这样当对象被销毁时,只有当它的最后一个指针被销毁时,你才能使用它们。 (例如Boost的shared_ptr。)

答案 1 :(得分:0)

当您调用dspace.erase()从哈希映射中删除元素时,将释放使用的内存。这意味着内存现在可用于其他事情。 意味着擦除该内存块中的数据。当您尝试通过指针访问数据时,可能看起来内存仍然完好无损,这可能是您询问内存是否已被释放的原因。但是,这样做会导致未定义的行为,因为您的指针所指向的内存可能随时被重用。

答案 2 :(得分:0)

  1. 如果从列表中删除Value实例,则释放其分配的内存。
  2. 通常会调用delete ptr;,但这不适用于您的情况,因为实例的内存已经释放。更改普通指针的值根本不会影响内存分配。
  3. 您的Valuechar *contents个成员。如果删除Value实例,则指向的内存可能会泄露 - 具体取决于您分配的方式。您应该考虑使用std :: string。