首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ Primer 智能指針實作:引用計數管理動態記憶體

     編輯:C++ 入門

智能指針 動機

裸指針易導致記憶體洩漏(忘記 delete)與懸空指針(重複釋放)。智能指針透過 RAII 自動管理生命週期。

引用計數 實作原理

  • 控制塊含:指向物件的指標、引用計數器
  • 複製構造/指派:計數器 +1
  • 解構:計數器 -1,歸零時 delete 物件與計數器
  • 自指派安全:先增右邊計數,再釋放左邊

完整教學級實作

#ifndef SMART_POINTER_H
#define SMART_POINTER_H
#include <iostream>

template <class T>
class SmartPointer {
public:
    SmartPointer(T value) : ptr(new T(value)), ref_count(new size_t(1)) {}
    ~SmartPointer() { release(); }

    // 複製構造
    SmartPointer(const SmartPointer& rhs) : ptr(rhs.ptr), ref_count(rhs.ref_count) {
        ++*ref_count;
    }
    // 指派運算子
    SmartPointer& operator=(const SmartPointer& rhs) {
        ++*rhs.ref_count;     // 先增右邊(防自指派)
        release();            // 再釋放左邊
        ptr = rhs.ptr;
        ref_count = rhs.ref_count;
        return *this;
    }

    T* get() const { return ptr; }
    T& operator*() const { return *ptr; }
    T* operator->() const { return ptr; }

private:
    T* ptr;
    size_t* ref_count;

    void release() {
        if (--*ref_count == 0) {
            delete ptr;
            delete ref_count;
            ptr = nullptr;
            ref_count = nullptr;
        }
    }
};
#endif

關鍵細節

  • ref_count 用動態配置 size_t*,實現共享計數
  • 指派運算子先 ++*rhs.ref_count 再 release(),正確處理自指派
  • 提供 operator*/operator-> 透明代理
  • 此為教學簡化版,生產環境建議用 std::shared_ptr(C++11)


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved