【发布时间】:2019-12-16 10:42:12
【问题描述】:
我知道这是一个很常见的问题,但我不理解相关问题中的代码示例(工作时间太长,太复杂)。所以,这是我的简单代码 sn-p:
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
int main(){
vector<int> v({1,2,3,4,5});
shared_ptr<vector<int>> v_ptr(&v);
cout << (*v_ptr)[2] << endl;
}
现在,这个简短的 sn-p 会造成内存泄漏。我认为这是由于在破坏 shared_ptr 之前破坏了向量造成的。但是,我不明白如何相应地销毁指针。简单地尝试 reset() 是行不通的,那我该怎么办,为什么会出现内存泄漏?
请不要问我为什么需要这样做,我是智能指针的新手,并试图了解如何使用它们。这个例子与我的工作无关,但是,我想避免将来发生内存泄漏,所以这个问题实际上可能会有所帮助。提前致谢!
【问题讨论】:
-
“这个简短的 sn-p 造成了内存泄漏”——是什么让你这么认为?
-
@tzaman 我对此表示怀疑,您链接的问题技术性很强,理解答案肯定需要对 C++ 有更深入的了解。
-
@KonradRudolph 这正是这里介绍的情况 - 为堆栈对象创建 shared_ptr 是问题所在,那里的答案概述了一些不同的解决方案(使用空删除器,或
make_shared,或new而不是堆栈分配)。对于试图了解为什么会出现问题的人来说,通读它会很有价值。 -
@tzaman 问题可能是相同的(或足够相似),但答案是针对截然不同的受众。完全不适合OP。
-
@KonradRudolph 那里的几个答案非常清楚,尤其是 Pete Becker,还有其他几个;即使是接受的我也不会称之为“太先进”。 OP 开始使用智能指针,此时学习对象所有权和生命周期变得必要,而不是深奥,因为管理这些是它们的全部目的。我不想对 OP 缺乏能力做出假设,特别是当他们表示有学习的愿望时。
标签: c++ shared-ptr