Có sự khác biệt giữa shared_ptr rỗng và rỗng không?
Trống shared_ptrkhông có khối điều khiển và số lần sử dụng của nó được coi là 0. Bản sao của khối trống shared_ptrlà một khối trống khác shared_ptr. Cả hai đều là các khối riêng biệt shared_ptrkhông chia sẻ khối điều khiển chung vì chúng không có nó. Rỗng shared_ptrcó thể được xây dựng với hàm tạo mặc định hoặc với hàm tạo có nullptr.
Null không trống shared_ptrcó khối điều khiển có thể được chia sẻ với các shared_ptrs khác . Bản sao không rỗng shared_ptrlà bản shared_ptrsao có cùng khối điều khiển với bản gốc shared_ptrnên số lượng sử dụng không bằng 0. Có thể nói rằng tất cả các bản sao của shared_ptrchia sẻ giống nhaunullptr . Null không rỗng shared_ptrcó thể được xây dựng bằng con trỏ null của kiểu đối tượng (not nullptr)
Đây là ví dụ:
#include <iostream>
#include <memory>
int main()
{
std::cout << "std::shared_ptr<int> ptr1:" << std::endl;
{
std::shared_ptr<int> ptr1;
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
std::cout << "std::shared_ptr<int> ptr1(nullptr):" << std::endl;
{
std::shared_ptr<int> ptr1(nullptr);
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
std::cout << "std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))" << std::endl;
{
std::shared_ptr<int> ptr1(static_cast<int*>(nullptr));
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
return 0;
}
Nó xuất ra:
std::shared_ptr<int> ptr1:
use count before copying ptr: 0
use count after copying ptr: 0
ptr1 is null
std::shared_ptr<int> ptr1(nullptr):
use count before copying ptr: 0
use count after copying ptr: 0
ptr1 is null
std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))
use count before copying ptr: 1
use count after copying ptr: 2
ptr1 is null
http://coliru.stacked-crooked.com/a/54f59730905ed2ff
shared_ptrvới con trỏ được lưu trữ không phải NULL." Cũng đáng đề cập đến lưu ý trước (p15), "Để tránh khả năng con trỏ treo lơ lửng, người dùng của hàm tạo này phải đảm bảo rằng nópvẫn còn hiệu lực ít nhất cho đến khi nhóm sở hữu củarbị phá hủy." Một công trình hiếm khi được sử dụng thực sự.