楼主: 
yam276 ('_')   
2025-03-09 01:45:04※ 引述《zenice (阿排)》之铭言:
: → yam276: 用智慧指标啊 用了就回不去了                             03/09 01:40
: → zenice: 作业不让用 对ㄚ                                         03/09 01:41
: → yam276: 那写个自干资源管理class 应该没很难                      03/09 01:41
: → yam276: template可以用吗                                        03/09 01:41
: → zenice: 应该可以 我下次写 这次bug改完交出去了                   03/09 01:42
让AI大师帮你自干一个了
应该比我写的好很多
AutoPtr.h
#pragma once
// 自定义资源管理类别,类似 std::unique_ptr,但不依赖智能指标
template <typename T>
class AutoPtr {
public:
    // 构造函数,接受裸指标
    explicit AutoPtr(T* ptr = nullptr) noexcept : ptr_(ptr) {}
    // 析构函数,自动释放资源
    ~AutoPtr() noexcept {
        delete ptr_;
    }
    // 禁止复制构造
    AutoPtr(const AutoPtr&) = delete;
    AutoPtr& operator=(const AutoPtr&) = delete;
    // 允许移动构造
    AutoPtr(AutoPtr&& other) noexcept : ptr_(other.ptr_) {
        other.ptr_ = nullptr; // 转移所有权,源对象置空
    }
    // 允许移动赋值
    AutoPtr& operator=(AutoPtr&& other) noexcept {
        if (this != &other) {
            delete ptr_; // 先释放原有的资源
            ptr_ = other.ptr_;
            other.ptr_ = nullptr; // 转移所有权
        }
        return *this;
    }
    // 获取裸指标(const版本)
    T* get() const noexcept {
        return ptr_;
    }
    // 解引用操作符
    T& operator*() const noexcept {
        return *ptr_;
    }
    // 成员访问操作符
    T* operator->() const noexcept {
        return ptr_;
    }
    // 检查是否为空
    bool is_null() const noexcept {
        return ptr_ == nullptr;
    }
    // 释放资源并重置为空
    void reset(T* ptr = nullptr) noexcept {
        if (ptr_ != ptr) {
            delete ptr_;
            ptr_ = ptr;
        }
    }
    // 交换两个AutoPtr的资源
    void swap(AutoPtr& other) noexcept {
        T* tmp = ptr_;
        ptr_ = other.ptr_;
        other.ptr_ = tmp;
    }
private:
    T* ptr_; // 管理的裸指标
};
// 非成员函数:交换两个AutoPtr
template <typename T>
void swap(AutoPtr<T>& lhs, AutoPtr<T>& rhs) noexcept {
    lhs.swap(rhs);
}
用法
sample.cpp
#include <iostream>
// 一个简单的测试类别
struct MyClass {
    MyClass() { std::cout << "MyClass constructed\n"; }
    ~MyClass() { std::cout << "MyClass destructed\n"; }
};
int main() {
    // 使用AutoPtr管理单个对象
    {
        AutoPtr<MyClass> ptr(new MyClass());
        // 自动释放,无需手动delete
    } // 离开作用域时,MyClass被自动析构
    // 使用AutoPtr管理数组
    {
        AutoPtr<MyClass[]> arr(new MyClass[3]);
        // 自动释放数组,无需手动delete[]
    }
    // 移动语义
    {
        AutoPtr<MyClass> ptr1(new MyClass());
        AutoPtr<MyClass> ptr2 = std::move(ptr1); // 移动构造
        if (ptr1.is_null()) {
            std::cout << "ptr1 is null after move\n";
        }
    }
    // 重置资源
    {
        AutoPtr<MyClass> ptr(new MyClass());
        ptr.reset(new MyClass()); // 释放旧资源,接管新资源
    }
    return 0;
}