Con trỏ (Pointers)
Con trỏ dùng để lưu địa chỉ của biến.
Cú pháp
Type *pointer;
Khởi tạo
Type *pointer; Pointer = tên biến;
Chức năng
- con trỏ dùng để lưu địa chỉ biến.
- con trỏ có thể gán giá trị null.
- con trỏ có thể tham chiếu bằng truyền tham chiếu.
- con trỏ có địa chỉ và kích thước riêng trên stack.
Ví dụ
#include <iostream>
using namespace std;
int main() {
// Biến nguyên thường
int a = 7;
// Biến con trỏ giữ địa chỉ của a.
int *p = &a;
// Giá trị lưu là giá trị của biến "a"
cout << "Value of Variable : " << *p << endl;
// In địa chỉ của biến "a"
cout << "Address of Variable : " << p << endl;
// gán lại giá trị.
*p = 6;
cout << "Value of the variable is now: " << *p << endl;
return 0;
}
Kết quả
Value of Variable : 7 Address of Variable : 0x6ffe34 Value of the variable is now: 6
Con trỏ thông minh (Smart Pointers) trong C++
Con trỏ thông minh là kiểu dữ liệu trừu tượng, dùng để biến con trỏ thường thành dạng quản lý bộ nhớ như xử lý file, socket mạng, v.v., cũng làm được nhiều việc như hủy tự động, đếm tham chiếu, v.v.
Con trỏ thông minh trong C++ có thể triển khai như lớp template, nạp chồng toán tử * và ->. auto_ptr, shared_ptr, unique_ptr và weak_ptr là các dạng con trỏ thông minh có thể triển khai bằng thư viện C++.
Ví dụ
#include<iostream>
using namespace std;
// Lớp con trỏ thông minh generic
template <class T>
class Smartpointer {
T *p; // Con trỏ thực tế
public:
// Constructor
Smartpointer(T *ptr = NULL) {
p = ptr;
}
// Destructor
~Smartpointer() {
delete(p);
}
// Nạp chồng toán tử giải tham chiếu
T & operator * () {
return *p;
}
// Nạp chồng toán tử mũi tên để truy cập thành viên của T
T * operator -> () {
return p;
}
};
int main() {
Smartpointer<int> p(new int());
*p = 26;
cout << "Value is: " << *p;
return 0;
}
Kết quả
Value is: 26
Shared Pointer (shared_ptr) trong C++
shared_ptr là một dạng con trỏ thông minh có thể triển khai bằng thư viện C++. Nó là container của con trỏ thô (raw pointer) và cấu trúc sở hữu đếm tham chiếu (reference counting - kỹ thuật lưu số lượng tham chiếu, con trỏ hoặc handle đến tài nguyên như đối tượng, khối bộ nhớ, không gian đĩa hoặc tài nguyên khác) của con trỏ chứa, phối hợp với tất cả các bản sao của shared_ptr.
Đối tượng được tham chiếu bởi con trỏ thô chứa sẽ chỉ bị hủy khi tất cả các bản sao của shared_ptr bị hủy.
Ví dụ
#include<iostream>
#include<memory>
using namespace std;
int main() {
shared_ptr<int> ptr(new int(7));
shared_ptr<int> ptr1(new int(6));
cout << ptr << endl;
cout << ptr1 << endl;
// Trả về số lượng shared_ptr tham chiếu đến cùng đối tượng quản lý.
cout << ptr.use_count() << endl;
cout << ptr1.use_count() << endl;
// Nhường quyền sở hữu của ptr trên đối tượng
// và con trỏ trở thành NULL
ptr.reset();
cout << ptr.get() << endl;
cout << ptr1.use_count() << endl;
cout << ptr1.get() << endl;
return 0;
}
Kết quả
0xe80900 0xe80940 1 1 0 1 0xe80940