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

(C++) list.error method and deleting memory using pointer

本文关键字:指针 删除 内存 方法 C++ list error      更新时间:2023-10-16
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 设置为列表中的其他成员,那么前一个成员占用的内存将被释放或不释放。
  1. 该元素将不复存在。如果元素是指针,则指针将不复存在,但它指向的对象不受影响。然而,元素本身已经消失了。否则,列表将极难使用。

  2. 使用指针执行的操作对列表完全没有影响。如果您希望指针使对象保持活动状态,以便在并且仅当指向它的最后一个指针被销毁时销毁对象,则可以使用这些指针。(比如Boost的shared_ptr

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

  1. 如果从列表中擦除Value实例,则会释放其分配的内存。
  2. 通常有人会调用delete ptr;但这在您的情况下不起作用,因为实例的内存已经释放。更改普通指针的值对内存分配完全没有影响。

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