(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 方法和使用指针删除内存的主要内容,如果未能解决你的问题,请参考以下文章

C++学习-指针的概念和定义方法

可与仅派生方法一起使用的 C++ 继承函数指针

C++ - 如何使用基指针覆盖子类方法

你啥时候想在 C++ 中使用指针和值?

指向对象开头的指针 (C++)

C++ 类成员函数指针的使用方法