shared_ptr
同じ を指す2 つの があります。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.
このバリアントでも、明示的に宣言された raw ポインターを使用して同じことが起こります。
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
(返されない) のはなぜですか? が返された場合、 2 回解放しようとしたのはなぜですか? a は、その兄弟の s と同じアドレスを指している場合にのみ、1増加すると考えました。2
shared_ptr
use_count()
1
int
shared_ptr
use_count
shared_ptr
のは、生std::shared_ptr
のポインタ (またはデフォルトで構築されている場合は生のポインタへの代入) によるuse_count
最初の の構築によってのみインクリメントされ、その後、追加の のコピー構築または前の のいずれかによる代入によってインクリメントされますか? また、インクリメントする他のすべての方法は何ですか?shared_ptr
shared_ptr
shared_ptr