创建std::shared_ptr来分配成员变量时内存泄漏
Memory leak when create std::shared_ptr to assign member variable
下面是一个例子:
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.........Hm??那第一个被创造的记忆呢?它是否被删除了?第三个循环(i=2),创建新的内存并分配给m_iTest....Hm. ??
所以,我认为这段代码发生内存泄漏,对吗?或者shared_ptr可以自动删除?
(这只是示例代码。不是关于使用向量或任何…)
当您分配给std::shared_ptr
时,先前管理的对象(如果有的话)的引用计数减少1。所以在你的循环中,当你第一次调用make_shared
时,你创建了一个引用计数为1的新对象。当您第二次调用它时,您将创建另一个引用计数为1的对象,并且前一个对象的引用计数下降到0,导致它被删除。
所以没有,没有内存泄漏。如果有的话,那也是一个设计糟糕的"智能"指针。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组