【发布时间】:2017-09-23 18:44:27
【问题描述】:
我创建了一个迭代器,当它被取消引用时,它返回一个指向动态分配的std::pair 的std::shared_ptr 的副本(在迭代器的内部使用new 创建)。迭代器按原样运行,但希望在循环结束时释放 pair 以防止内存泄漏。
for (auto it = parser.begin(); it != parser.end(); ++it) {
shared_ptr<pair<string, string>> record = *it;
// Analysis of pair
// delete pair with delete, or reset
}
但是,我无法释放 pair。我尝试过delete record、delete *record 和record.reset(),但这些都无法编译。
【问题讨论】:
-
我认为您误解了智能指针的实际含义和作用。
-
你为什么这么认为?
-
这对在 smart 指针中,即您不需要手动释放内存,智能指针会为您完成 :)
-
啊……我明白了。我现在真的觉得很傻。我知道智能指针会为我删除它们的内容,但不知何故我忘了哈哈
-
解析器对象必须确保您正在迭代的
pair上的引用计数不能达到零并触发delete(否则代码将已经存在竞争条件并被破坏)。所以,你可以说[const] auto& record = **it;来获得对pair的引用,这比在共享指针中两次摆弄原子使用计数更简单、更快捷。
标签: c++ memory-management shared-ptr smart-pointers