Cod*_*cks 3 c++ pointers memory-management shared-ptr double-free
我有两个shared_ptrs指向相同的int,即调用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.
如果两者都指向相同的东西,为什么会use_count()返回1(但不是2)shared_ptr?如果use_count()退回1,那么为什么试图释放int两次呢?我认为只有当它指向与其兄弟相同的地址时,它shared_ptr才会增加use_count一个shared_ptr.
是std::shared_ptr的use_count仅通过第一递增shared_ptr的建设由原始指针'(或分配到原始指针,如果默认构造的),然后通过附加的shared_ptr通过任何现有的S’复制建筑或分配shared_ptrS' 还有什么其他增量方式呢?
当您指向a时shared_ptr,该共享指针将获得该指针的所有权.您不再被允许,将delete其传递给另一个shared_ptr或类似的人.没有全局查找表供新shared_ptr的检查,以查找已经有另一个shared_ptr已经拥有指针或类似的东西.
换句话说,当shared_ptr通过传入相同的指针而不是复制shared_ptr自身(增加使用计数)来创建第二个时,会发生双重自由错误.直到稍后才能观察到未定义的行为这一事实不会改变它实际发生的位置.
| 归档时间: | 
 | 
| 查看次数: | 824 次 | 
| 最近记录: |