加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std :: shared_ptr的use_count递增的所有方法是什么?

发布时间:2020-12-16 09:55:02 所属栏目:百科 来源:网络整理
导读:我有两个指向同一个int的shared_ptrs,即在它们上调用get()会返回相同的地址.但是对它们调用use_count()会返回1.当它们中的最后一个超出范围时,它会尝试释放已经被另一个释放的内存,从而导致双重释放运行时错误: #include memory#include iostreamusing name
我有两个指向同一个int的shared_ptrs,即在它们上调用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_ptrs指向同一个东西,为什么use_count()返回1(但不是2)?如果use_count()返回1,那么为什么尝试释放int两次?我认为shared_ptr会将use_count增加1,当且仅当它指向与其兄弟shared_ptrs相同的地址时.

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读