(C++) list.error 方法和使用指针删除内存
Posted
技术标签:
【中文标题】(C++) list.error 方法和使用指针删除内存【英文标题】:(C++) list.error method and deleting memory using pointer 【发布时间】:2012-07-21 20:49:17 【问题描述】:typedef struct value
char* contents;
int size;
Value;
hash_map<Key,list<Value>,hash<Key>,eqKey> dspace;
list<Value> vallist;
.
每次创建Value
变量并添加到此列表时,我都在做什么。
我有一个指针Value * ptr
,我使用这个指针指向列表中的一个成员,最后我从列表中删除了该成员。
现在我可以使用指针访问值,但不能使用列表迭代器。
我有两个问题
-
确实从列表中删除了元素,但分配的内存保持不变,或者内存也在被释放。
是否可以使用此 ptr 释放内存。或者如果我将 ptr 设置为列表的其他成员,那么前一个成员占用的内存将被释放或不释放。
【问题讨论】:
C++ 的基本规则:事情不会神奇地发生。如果发生了某事,您就会知道它发生了以及为什么会发生。如果你没有要求它,它可能不会发生。 C 程序员的 C++ 规则:不要对结构进行类型定义。初学者的 C++ 规则:使用std::string
。
当你删除一个成员时,它就消失了,你的指针也失效了。如果你想保留一个值,你必须做一个副本。
只是一个建议:而不是映射类型为列表的哈希图,也许unordered_multimap
也可以解决问题?您不会在具有相同类型的元素中进行顺序排序,但它会更简单且更有效。
【参考方案1】:
元素不复存在。如果元素是指针,则指针不复存在,但它指向的对象不受影响。然而,元素本身已经消失了。否则,列表将非常难以使用。
您对指针所做的操作对列表完全没有影响。如果您想要指针保持对象处于活动状态,以便对象在且仅当最后一个指向它的指针被销毁时被销毁,您可以使用它们。 (比如Boost的shared_ptr
。)
【讨论】:
【参考方案2】:当您调用dspace.erase()
从您的哈希图中删除一个元素时,所使用的内存将被释放。这意味着内存现在可用于其他用途。它确实不意味着该内存块中的数据已被擦除。当您尝试通过指针访问数据时,内存似乎仍然完好无损,这可能就是您询问内存是否已释放的原因。但是,这样做会导致未定义的行为,因为您的指针指向的内存可能随时被重用。
【讨论】:
如果您觉得我的回答有帮助,请点击对勾接受。此外,您可以通过点击向上箭头对任何答案进行投票。【参考方案3】:-
如果您从列表中删除
Value
实例,则其分配的内存将被释放。
通常会调用delete ptr;
,但这不适用于您的情况,因为实例的内存已被释放。更改普通指针的值根本不会影响内存分配。
您的 Value
有一个 char *contents
成员。如果 Value
实例被删除,它指向的内存可能会泄漏 - 取决于您分配它的方式。您应该考虑改用 std::string 。
【讨论】:
以上是关于(C++) list.error 方法和使用指针删除内存的主要内容,如果未能解决你的问题,请参考以下文章