Câu lạc bộ Tin học dành cho học sinh Tiểu học

HỌC C++ ✨ Tiết 13: Con trỏ thông minh (Smart Pointers) và Tham chiếu (References) trong C++ hiện đại ✨

Trạng thái

♥ Lượt xem: 8
♥ Lượt phản hồi: 0

Tham gia
28/10/2025
Bài viết
368
Điểm Like
1,748
Điểm Uy tín
364,562
Tí Tinh Tế
Miu Mềm Mại
Rồng Rực Rỡ
Tỵ Tinh Tường
Heo Hiền Hậu
Tuổi Mùi
Phù điêu Hổ
Phù điêu Rồng
Hổ Hào Hiệp
Ngựa Ngộ Nghĩnh
Dê Dịu Dàng
Tích cực hoạt động

🎯 Mục tiêu tiết 13

Hôm nay bạn sẽ học:
  1. Tham chiếu (&) là gì
  2. Sự khác nhau giữa con trỏtham chiếu
  3. Con trỏ thông minh (Smart Pointers): unique_ptr, shared_ptr, weak_ptr
  4. Cách chúng giúp tránh lỗi tràn bộ nhớ (memory leak)
  5. Ứ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
}
📘 Khác biệt giữa con trỏ và tham chiếu:
Đặc điểmCon trỏTham chiếu
Có thể rỗng (null)?✅❌ Không
Có thể đổi đối tượng trỏ đến?✅❌ Không
Cú pháp truy cập giá trị*ptrDù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)

Trong C++ hiện đại, chúng ta KHÔNG nên dùng newdelete thủ công nữa.
Thay vào đó dùng Smart Pointer — giúp quản lý bộ nhớ tự động, tránh quên delete.
Muốn dùng phải:
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
}
➡️ Khi 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;
}
Kết quả:
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;
}
Kết quả:
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 delete thủ 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:
  1. Dùng shared_ptr để tạo 1 nhân vật game có máu và năng lượng.
  2. In ra số lượng con trỏ đang giữ vùng nhớ.
  3. Khi con trỏ cuối cùng bị xóa, hãy in ra “Nhân vật đã bị loại bỏ!”
 

Trạng thái

♥ Lượt xem: 8
♥ Lượt phản hồi: 0

Trên Bottom