Có sự khác biệt giữa shared_ptr rỗng và rỗng không?
Trống shared_ptr
khô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_ptr
là một khối trống khác shared_ptr
. Cả hai đều là các khối riêng biệt shared_ptr
không chia sẻ khối điều khiển chung vì chúng không có nó. Rỗng shared_ptr
có 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_ptr
có khối điều khiển có thể được chia sẻ với các shared_ptr
s khác . Bản sao không rỗng shared_ptr
là bản shared_ptr
sao có cùng khối điều khiển với bản gốc shared_ptr
nê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_ptr
chia sẻ giống nhaunullptr
. Null không rỗng shared_ptr
có 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_ptr
vớ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óp
vẫn còn hiệu lực ít nhất cho đến khi nhóm sở hữu củar
bị phá hủy." Một công trình hiếm khi được sử dụng thực sự.