繁体   English   中英

use_count std :: shared_ptr的所有增加方式是什么?

[英]What are all the ways use_count of std::shared_ptr is incremented?

我有两个指向同一个int shared_ptr ,即在它们上调用get()返回相同的地址。 但是在它们上面调用use_count()返回1 当它们中的最后一个超出范围时,它会尝试释放已经被另一个释放的内存,从而导致双重释放运行时错误:

#include <memory>
#include <iostream>
using namespace std;

int main() {
    shared_ptr<int> sp1(make_shared<int>(7));
    shared_ptr<int> sp2(&(*sp1));
    cout << sp1.use_count() << endl;  // 1
    cout << sp2.use_count() << endl;  // 1
    cout << sp1.get() << endl;        // same address
    cout << sp2.get() << endl;        // same address
}
// ^ Double free runtime error at closing brace.

在此变体中使用显式声明的原始指针也会发生同样的事情:

int main() {
    int *raw_ptr = new int(8);
    shared_ptr<int> sp3(raw_ptr);
    shared_ptr<int> sp4(raw_ptr);
    cout << sp3.use_count() << endl;  // 1
    cout << sp4.use_count() << endl;  // 1
    cout << sp3.get() << endl;        // same address
    cout << sp4.get() << endl;        // same address
}
// ^ Double free runtime error at closing brace.

如果shared_ptr指向同一个东西,为什么use_count()返回1 (但不是2 )? 如果use_count()返回1 ,那么为什么尝试释放int两次? 我认为shared_ptr会将use_count增加1,当且仅当它指向与其兄弟shared_ptr相同的地址时。

std::shared_ptruse_count仅由第一个shared_ptr构造的原始指针(或指向原始指针,如果是默认构造的)增加,然后通过附加的shared_ptr s'复制构造或任何先前的赋值来增加shared_ptr s? 还有什么其他增量方式呢?

当您指定shared_ptr ,该共享指针将获得该指针的所有权。 您不再被允许delete它,将其传递给另一个shared_ptr或类似的。 新的shared_ptr没有全局查找表来检查是否已经有另一个已经拥有指针的shared_ptr或类似的东西。

换句话说,当通过传入相同的指针而不是复制shared_ptr本身(增加使用计数)来创建第二个shared_ptr时,会发生双重自由错误。 直到稍后才能观察到未定义的行为这一事实不会改变它实际发生的位置。

您应该使用shared_ptr的复制构造函数来正确构造第二个共享指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM