0
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 设置为列表的其他成员,则前一个成员占用的内存将被释放或不释放。
4

3 回答 3

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

  2. 您对指针所做的操作对列表完全没有影响。如果您想要指针保持对象处于活动状态,以便对象在且仅当最后一个指向它的指针被销毁时被销毁,您可以使用它们。(比如 Boost 的shared_ptr。)

于 2012-07-21T21:12:31.157 回答
0

当你调用dspace.erase()从你的 hashmap 中删除一个元素时,使用的内存被释放。这意味着内存现在可用于其他用途。这并不意味着该内存块中的数据被擦除。当您尝试通过指针访问数据时,内存似乎仍然完好无损,这可能就是您询问内存是否已释放的原因。但是,这样做会导致未定义的行为,因为您的指针指向的内存可能随时被重用。

于 2012-07-21T21:19:11.017 回答
0
  1. 如果您Value从列表中删除该实例,则其分配的内存将被释放。
  2. 通常会调用delete ptr;,但这不适用于您的情况,因为实例的内存已被释放。更改普通指针的值根本不会影响内存分配。

Value有一个char *contents成员。如果实例被删除,它指向的内存可能会泄漏Value- 取决于您分配它的方式。您应该考虑改用 std::string 。

于 2012-07-21T21:23:04.063 回答