Mục tiêu tiết 13
Hôm nay bạn sẽ học:- Tham chiếu (
&) là gì - Sự khác nhau giữa con trỏ và tham chiếu
- Con trỏ thông minh (Smart Pointers):
unique_ptr,shared_ptr,weak_ptr - Cách chúng giúp tránh lỗi tràn bộ nhớ (memory leak)
- Ứng dụng thực tế trong lập trình hiện đại
1. Tham chiếu (Reference)
Tham chiếu là một “tên khác” của biến gốc, không cần * hoặc & khi truy cập.
Mã:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int& ref = a; // ref là tham chiếu đến a
ref = 20; // thay đổi ref cũng là thay đổi a
cout << "a = " << a << endl; // In: a = 20
cout << "ref = " << ref << endl; // In: ref = 20
}
| Đặc điểm | Con trỏ | Tham chiếu |
|---|---|---|
| Có thể rỗng (null)? | ||
| Có thể đổi đối tượng trỏ đến? | ||
| Cú pháp truy cập giá trị | *ptr | Dùng trực tiếp ref |
| Dễ gây lỗi hơn |
2. Ứng dụng của tham chiếu
Thường dùng trong truyền tham số cho hàm để không tạo bản sao dữ liệu.
Cách thường (truyền theo giá trị):
Mã:
void tang(int x) {
x++;
}
Cách đúng (truyền tham chiếu):
Mã:
void tang(int& x) {
x++;
}
int main() {
int a = 5;
tang(a);
cout << a; // In ra 6
}
3. Con trỏ thông minh (Smart Pointer)
Muốn dùng phải:Trong C++ hiện đại, chúng ta KHÔNG nên dùngnewvàdeletethủ công nữa.
Thay vào đó dùng Smart Pointer — giúp quản lý bộ nhớ tự động, tránh quêndelete.
Mã:
#include <memory>
using namespace std;
unique_ptr – Con trỏ độc quyền
Một vùng nhớ chỉ có một con trỏ duy nhất sở hữu.
Mã:
#include <iostream>
#include <memory>
using namespace std;
int main() {
unique_ptr<int> p1 = make_unique<int>(100);
cout << *p1 << endl; // In ra 100
// unique_ptr không thể copy
// unique_ptr<int> p2 = p1; ❌ sai
}
p1 ra khỏi phạm vi hàm, nó tự động giải phóng bộ nhớ.
shared_ptr – Con trỏ chia sẻ
Nhiều con trỏ có thể cùng sở hữu chung một vùng nhớ.Khi không còn ai dùng, vùng nhớ được tự động xóa.
Mã:
#include <iostream>
#include <memory>
using namespace std;
int main() {
shared_ptr<int> a = make_shared<int>(50);
shared_ptr<int> b = a;
cout << "Gia tri: " << *a << endl;
cout << "So luong con tro dang giu: " << a.use_count() << endl;
}
Mã:
Gia tri: 50
So luong con tro dang giu: 2
weak_ptr – Con trỏ yếu
Dùng để tránh vòng lặp tham chiếu khi shared_ptr trỏ chéo nhau.
Mã:
#include <memory>
#include <iostream>
using namespace std;
int main() {
shared_ptr<int> sp = make_shared<int>(200);
weak_ptr<int> wp = sp;
cout << "Con tro con ton tai? " << !wp.expired() << endl;
sp.reset();
cout << "Sau khi giai phong: " << wp.expired() << endl;
}
Mã:
Con tro con ton tai? 1
Sau khi giai phong: 1
4. Tại sao smart pointer quan trọng
- Giúp C++ quản lý bộ nhớ tự động như Python, Java
- Không cần
deletethủ công - Tránh lỗi “memory leak” hoặc “dangling pointer”
- Là chuẩn trong C++11 trở lên
Bài tập Tiết 13
Viết chương trình:- Dùng
shared_ptrđể tạo 1 nhân vật game có máu và năng lượng. - In ra số lượng con trỏ đang giữ vùng nhớ.
- Khi con trỏ cuối cùng bị xóa, hãy in ra “Nhân vật đã bị loại bỏ!”
