楼主:
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;
}