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