面试题答案
一键面试#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;
}