我有两个shared_ptr
s 指向同一个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.
如果两个s 都指向同一个东西,为什么use_count()
返回1
(而不是)?如果返回,那么为什么要尝试释放两次?我认为 a当且仅当它指向与它的兄弟s相同的地址时才会增加一。2
shared_ptr
use_count()
1
int
shared_ptr
use_count
shared_ptr
a 是否仅由 first由原始指针构造(或分配给原始指针,如果默认构造)然后通过附加s std::shared_ptr
'复制构造或任何先前s 分配来增加?如果有的话,还有哪些其他的递增方式?use_count
shared_ptr
shared_ptr
shared_ptr