MST

星途 面试题库

面试题:C++中std::unique_ptr自定义删除器的基础使用

请用C++ 实现一个std::unique_ptr,并为其定义一个自定义删除器,删除器的功能是打印一条自定义的删除信息。假设被管理的对象是一个简单的类MyClass,包含一个int成员变量。
34.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <memory>

class MyClass {
public:
    int data;
    MyClass(int value) : data(value) {}
};

// 自定义删除器
struct MyDelete {
    void operator()(MyClass* ptr) const {
        std::cout << "自定义删除信息: 正在删除MyClass对象" << std::endl;
        delete ptr;
    }
};

// 自定义的unique_ptr实现
template <typename T, typename D = std::default_delete<T>>
class MyUniquePtr {
private:
    T* ptr;
    D deleter;
public:
    MyUniquePtr() : ptr(nullptr) {}
    MyUniquePtr(T* p) : ptr(p) {}
    MyUniquePtr(T* p, const D& d) : ptr(p), deleter(d) {}

    MyUniquePtr(const MyUniquePtr&) = delete;
    MyUniquePtr& operator=(const MyUniquePtr&) = delete;

    MyUniquePtr(MyUniquePtr&& other) noexcept : ptr(other.ptr), deleter(std::move(other.deleter)) {
        other.ptr = nullptr;
    }

    MyUniquePtr& operator=(MyUniquePtr&& other) noexcept {
        if (this != &other) {
            reset();
            ptr = other.ptr;
            deleter = std::move(other.deleter);
            other.ptr = nullptr;
        }
        return *this;
    }

    ~MyUniquePtr() {
        reset();
    }

    T* get() const {
        return ptr;
    }

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

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

    void reset(T* p = nullptr) {
        if (ptr) {
            deleter(ptr);
        }
        ptr = p;
    }

    T* release() {
        T* temp = ptr;
        ptr = nullptr;
        return temp;
    }
};

你可以使用以下方式测试:

int main() {
    MyUniquePtr<MyClass, MyDelete> myPtr(new MyClass(42), MyDelete());
    std::cout << "myPtr指向对象的数据: " << myPtr->data << std::endl;
    // myPtr离开作用域时,会调用自定义删除器
    return 0;
}