c++ - 创建 std::shared_ptr 以分配成员变量时内存泄漏

标签 c++ memory-leaks

这是一个示例类。

class Test {
private:
    std::shared_ptr<int> m_iTest;
    void testLoop(void);
};


void Test::testLoop(void)
{
    for (int i = 0; i < 5; i++)
       m_iTest = std::make_shared<int>;
}

这段代码中,当调用testLoop函数时,分配新的int类型内存并赋值给m_iTest成员变量。第一个循环(i=0),创建新内存并分配给m_iTest。第二个循环(i=1),创建新内存并分配给 m_iTest…………嗯???那么第一个创建的内存呢?是删还是不删?而第三个循环(i=2),创建新内存并分配给m_iTest....Hm..???

所以,我认为这段代码发生了内存泄漏,对吧?还是可以自动删除shared_ptr?

(这只是示例代码。不涉及使用 vector 或任何...)

最佳答案

当您分配给 std::shared_ptr 时,先前管理的对象(如果有的话)的引用计数会减 1。因此在您的循环中,当您调用 make_shared 第一次,你创建了一个引用计数为1的新对象。当你第二次调用它时,你创建了另一个引用计数为1的对象,并且前一个对象的引用计数下降到 0,导致它被删除。

所以不,没有内存泄漏。如果有,那将是一个设计糟糕的“智能”指针。

关于c++ - 创建 std::shared_ptr 以分配成员变量时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31690599/

相关文章:

c# - ASP.NET:在某些情况下我应该担心内存泄漏吗? [C#]

javascript - JavaScript 中的闭包内存泄漏模式

javascript - 当前浏览器中的闭包和 (jQuery) DOM 事件导致内存泄漏?

memory-leaks - 通知程序潜在的内存泄漏

c++ - 如何将 bsoncxx::document::element 写入控制台

c++ - 从 map 中获取项目并添加到 vector C++

c++ - protobuf嵌入式消息最佳实践

c++ - 基类的前向声明

c++ - C++ 的检测(诊断)库

c - fortran 程序的 mtrace