C ++ shared_ptr

C Shared_ptr



Các shared_ptr là một loại con trỏ thông minh của C ++ có chứa quyền sở hữu chung của đối tượng được tạo bởi con trỏ. Nó chia sẻ quyền sở hữu đối tượng khi lưu trữ con trỏ vào một đối tượng khác và bộ đếm tham chiếu được chia sẻ đếm số lượng chủ sở hữu. Các shared_ptr tăng một bộ đếm tham chiếu sau khi sao chép đối tượng và giảm một bộ đếm tham chiếu sau khi hủy đối tượng. Bộ nhớ thuộc sở hữu của đối tượng được phân bổ lại nếu đối tượng thuộc sở hữu cuối cùng shared_ptr bị phá hủy, hoặc cài lại() hàm được gọi để gán một con trỏ khác cho đối tượng. Khi mà shared_ptr không sở hữu bất kỳ đối tượng nào, khi đó nó được gọi là con trỏ dùng chung rỗng. Các cách sử dụng khác nhau của shared_ptr đã được hiển thị trong hướng dẫn này.

Ví dụ 1: Khai báo con trỏ dùng chung theo các cách khác nhau

Ba cách khác nhau để khai báo một con trỏ dùng chung được hiển thị trong ví dụ sau. Một lớp với một phương thức khởi tạo và một phương thức công khai đã được khai báo trong mã. Hàm tạo sẽ in một thông báo khi một đối tượng chia sẻ mới được tạo với hàm tạo. Các Trưng bày() phương thức sẽ in thông báo dựa trên đối tượng con trỏ dùng chung đang gọi. Ở đây, đối tượng con trỏ chia sẻ đầu tiên đã được tạo mà không cần gọi hàm tạo. Đối tượng con trỏ chia sẻ thứ hai đã được tạo bằng cách gọi hàm tạo. Con trỏ chia sẻ thứ ba đã được tạo bằng cách gán con trỏ được chia sẻ đầu tiên. Các Trưng bày() phương thức đã được gọi ba lần bằng cách sử dụng ba đối tượng con trỏ dùng chung.







// Bao gồm các thư viện cần thiết

#bao gồm

#bao gồm

usingnamespacestd;

// Định nghĩa lớp
classMyClass{
công cộng:
// Khai báo hàm tạo
Lớp học của tôi() {
Giá cả<<'Hàm tạo được gọi. ';
}
// Khai báo một phương thức để in văn bản
voidDisplay(chuỗi str)
{
Giá cả<<'Phương thức Display () được gọi từ'<<P<<'con trỏ. ';
}
};

intmain()
{
// Khởi tạo shared_ptr mà không gọi hàm tạo
shared_ptr p1=make_shared();
p1->Trưng bày('đầu tiên');
// Khởi tạo shared_ptr bằng cách gọi hàm tạo
shared_ptr p2=shared_ptr(newMyClass);
p2->Trưng bày('thứ hai');

// Khởi tạo shared_ptr bằng cách gán
shared_ptr p3=p1;
p3->Trưng bày('ngày thứ ba');
return0;
}

Đầu ra:



Kết quả sau sẽ xuất hiện sau khi thực hiện đoạn mã trên. Hàm tạo đã gọi chỉ tại thời điểm tạo đối tượng thứ hai. Vì vậy, thông báo của hàm tạo chỉ được in một lần:







Ví dụ 2: In Vị trí Con trỏ Chia sẻ Được Lưu trữ

Con trỏ chia sẻ hàm get () được sử dụng để trả về vị trí con trỏ được chia sẻ, được lưu trữ. Ví dụ sau sẽ in vị trí của các con trỏ được lưu trữ, chia sẻ được tạo bởi lớp và hàm. Ở đây, một lớp với một phương thức khởi tạo đã được định nghĩa để sử dụng để tạo một con trỏ dùng chung. Một hàm đã được khai báo để tạo một con trỏ dùng chung và in vị trí con trỏ được chia sẻ bằng cách sử dụng hàm get (). Trong đoạn mã này, con trỏ chia sẻ đầu tiên đã được tạo bằng cách sử dụng lớp, con trỏ chia sẻ thứ hai đã được tạo bằng hàm và con trỏ chia sẻ thứ ba đã được tạo bằng cách gán con trỏ đầu tiên.

// Bao gồm các thư viện cần thiết

#bao gồm

#bao gồm

usingnamespacestd;

// Định nghĩa lớp
classMyClass
{
công cộng:
// Khai báo hàm tạo
Lớp học của tôi() {
Giá cả<<'Hàm tạo được gọi. ';
}
};
// Định nghĩa hàm để khởi tạo con trỏ
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
Giá cả<<p2.hiểu được() <<' ';
}

intmain()
{
// Khởi tạo shared_ptr bằng cách gọi hàm tạo
shared_ptr p1=shared_ptr(newMyClass);
Giá cả<<p1.hiểu được() <<' ';

// Khởi tạo shared_ptr bằng cách gọi hàm
Init_shared_ptr();

// Khởi tạo shared_ptr bằng cách gán
shared_ptr p3=p1;
Giá cả<<p3.hiểu được() <<' ';
return0;
}

Đầu ra:



Kết quả tương tự sau đây sẽ xuất hiện sau khi thực hiện đoạn mã trên. Trong đầu ra, giá trị trả về của hàm get () cho con trỏ chia sẻ thứ nhất và thứ ba là như nhau. Tuy nhiên, con trỏ chia sẻ thứ hai thì khác:

Ví dụ 3: Đếm các đối tượng con trỏ được chia sẻ

Ví dụ sau mô tả một cách để đếm số đối tượng được trỏ bởi một con trỏ dùng chung sau khi tạo và hủy con trỏ. Một lớp với một phương thức khởi tạo đã được khai báo trong mã. Con trỏ chia sẻ đầu tiên đã được tạo bằng cách sử dụng lớp và con trỏ chia sẻ thứ hai đã được tạo bằng cách sử dụng con trỏ chia sẻ đầu tiên. Số lượng đối tượng được trỏ bởi cả hai con trỏ dùng chung trước và sau khi gọi hàm reset () đã được in sau đó.

// Bao gồm các thư viện cần thiết

#bao gồm

#bao gồm

usingnamespacestd;
// Định nghĩa lớp
classMyClass{
công cộng:
// Khai báo hàm tạo
Lớp học của tôi() {
Giá cả<<'Hàm tạo được gọi. ';
}
};
intmain()
{
// Khởi tạo shared_ptr đầu tiên bằng cách gọi hàm tạo
shared_ptr p1(newMyClass);

// Hiển thị số lượng đối tượng shared_ptr bằng con trỏ đầu tiên
Giá cả<<'p1 trỏ tới'<<p1.use_count() <<' các đối tượng). ';
// Khởi tạo shared_ptr thứ hai bằng shared_ptr đầu tiên
shared_ptr p2(p1);
// Hiển thị số lượng đối tượng shared_ptr theo con trỏ thứ nhất và thứ hai
Giá cả<<'p2 trỏ tới'<<p2.use_count() <<' các đối tượng). ';
Giá cả<<'p1 trỏ tới'<<p1.use_count() <<' các đối tượng). ';
// Xóa quyền sở hữu của con trỏ đầu tiên khỏi đối tượng shared_ptr
p1.cài lại();
// Hiển thị số lượng đối tượng shared_ptr bằng con trỏ thứ hai
Giá cả<<'p2 trỏ tới'<<p2.use_count() <<' các đối tượng). ';
return0;
}

Đầu ra:

Kết quả sau sẽ xuất hiện sau khi thực hiện đoạn mã trên. Con trỏ đầu tiên, p1 , là trỏ đến một đối tượng sau khi tạo. Sau khi tạo con trỏ thứ hai, p2 , sử dụng con trỏ đầu tiên, p1 , cả hai con trỏ đều trỏ đến hai đối tượng để chia sẻ con trỏ. Sau khi gọi hàm reset () cho con trỏ, p1 , một đối tượng đã bị phá hủy và con trỏ, p2 , bây giờ chỉ đến một đối tượng.

Phần kết luận:

Mục đích của việc sử dụng con trỏ dùng chung trong C ++ đã được giải thích trong hướng dẫn này bằng cách sử dụng các ví dụ đơn giản. Tạo con trỏ dùng chung theo nhiều cách khác nhau, nhận vị trí con trỏ dùng chung được lưu trữ và đếm số đối tượng được trỏ bởi con trỏ dùng chung. Tôi hy vọng các lập trình viên C ++ sẽ có thể sử dụng con trỏ được chia sẻ trong mã của họ sau khi đọc hướng dẫn này.