【问题标题】:How to delete dynamic elements stored in a std::forward_list如何删除存储在 std::forward_list 中的动态元素
【发布时间】:2015-11-13 17:02:44
【问题描述】:

我在 C++ 中使用 std::forward_list 来存储动态分配的元素。我想知道“删除”列表中的元素或释放内存的正确方法是什么。

std::forward_list<int> integerList;

for (int i = 0; i < 5; i++) {
    int* intPtr = new int(i); 
    integerList.push_front(*intPtr);
}

在这段代码执行之后,我想应该发生的是 forward_list 持有一个动态分配的 int。现在,我将如何正确调用 delete 呢?我注意到 forward_list 容器有一个 clear() 函数,但它会在每个节点中的所有元素上调用 delete 吗?

【问题讨论】:

  • I'm using a std::forward_list in C++ to store dynamically allocated elements. 嗯,不,你根本没有这样做。您正在存储这些元素的 副本 并泄露原始元素。
  • @Borgleader 不错。我错过了。
  • 谢谢大家,这是有道理的。那么删除原件并确保不泄漏的正确方法是什么?我应该添加删除 intPtr;在 for 循环的最后一行?
  • 添加删除将修复泄漏,但您不需要首先更新 int。 integerList.push_front(i); 可以工作 just as well
  • 是的,我明白,我的问题有点复杂,我确实需要“新”,所以我只是想知道应该如何处理。谢谢!

标签: c++


【解决方案1】:

我认为应该发生的是 forward_list 拥有一个动态分配的 int

不,它不包含动态分配的int。元素的类型为int,当integerList.push_front(*intPtr);时,将复制该值。

另一方面,你在 for 循环中遇到内存泄漏,你需要deletenewed。

for (int i = 0; i < 5; i++) {
    int* intPtr = new int(i); 
    integerList.push_front(*intPtr);
    delete intPtr;
}

如果要保存动态分配的元素,应将元素的类型声明为指针,最后自己删除元素。

std::forward_list<int*> integerList;
for (int i = 0; i < 5; i++) {
    int* intPtr = new int(i); 
    integerList.push_front(intPtr);
}
...
for (auto e : integerList) {
    delete e;
}

您可以使用智能指针来避免这种内存管理,例如std::unique_ptrstd::shared_ptr

【讨论】:

    【解决方案2】:

    是的,您必须遍历列表并调用删除每个指针元素。

    【讨论】:

    • 错了,看看列表的类型(以及每个元素的添加方式)
    • 正确,我错过了。让我们假设这是更正的:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多