Có sự khác biệt nào giữa shared_ptr trống và không?
Trống shared_ptr
không có khối điều khiển và số lượng sử dụng của nó được coi là 0. Bản sao trống shared_ptr
là một ô trống khác shared_ptr
. Cả hai đều là riêng biệt shared_ptr
s không chia sẻ khối điều khiển chung vì chúng không có. Làm trố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 mất nullptr
.
Không trống rỗng shared_ptr
có khối điều khiển có thể được chia sẻ với shared_ptr
s khác.Bản sao không trống rỗng shared_ptr
là shared_ptr
chia sẻ cùng một khối điều khiển như ban đầu shared_ptr
vì vậy số lượng sử dụng không phải là 0,Có thể nói rằng tất cả các bản sao của shared_ptr
đều chia sẻ cùng một số nullptr
. rỗng không trống shared_ptr
thể được xây dựng với con trỏ null loại đối tượng (không nullptr
)
Dưới đâ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ó 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
Nguồn
2016-05-16 12:04:46
Worth chú ý: ** C++ 11 § 20.7.2.2.1 (p16) ** "Lưu ý: Hàm khởi tạo này cho phép tạo một cá thể' shared_ptr' rỗng với một con trỏ được lưu trữ không NULL. " Cũng đáng nói đến lưu ý trước (p15), "Để tránh khả năng của một con trỏ lơ lửng, người sử dụng của constructor này phải đảm bảo rằng' p' vẫn còn hợp lệ ít nhất cho đến khi nhóm sở hữu 'r' bị hủy." Một công trình hiếm khi được sử dụng thực sự. – WhozCraig
@Cubbi Một 'shared_ptr' có' get() 'trả về' nullptr' * không * so sánh bằng 'nullptr' bất kể nó có sở hữu gì không. –
Một 'shared_ptr's * có thể * hữu ích, để đảm bảo một số hàm được thực hiện khi tất cả các con trỏ sở hữu hết phạm vi (ngay cả trong trường hợp ngoại lệ!). Không chắc chắn, cho dù bây giờ có một lớp học đặc biệt cho việc này. – coldfix