MST

星途 面试题库

面试题:C++中自定义内存管理策略下变量生命周期的精确控制

假设你要实现一个C++自定义内存管理策略,该策略需要精确控制变量的生命周期,不仅要考虑正常的对象创建与销毁,还要处理对象在异常情况下的生命周期管理。请详细描述实现思路,并给出关键代码示例。
15.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 自定义内存分配器:继承自std::allocator,重写allocatedeallocate方法,实现自定义的内存分配和释放逻辑。
  2. 智能指针封装:使用std::unique_ptrstd::shared_ptr,结合自定义的删除器,确保对象在异常情况下也能正确释放内存。
  3. 异常安全设计:在构造函数和析构函数中使用异常安全的代码结构,如RAII(Resource Acquisition Is Initialization)机制,确保对象在创建和销毁过程中遇到异常时资源能正确管理。

关键代码示例

#include <iostream>
#include <memory>

// 自定义内存分配器
template <typename T>
class MyAllocator : public std::allocator<T> {
public:
    using std::allocator<T>::allocator;
    T* allocate(std::size_t n) {
        // 自定义内存分配逻辑
        void* p = std::malloc(n * sizeof(T));
        if (!p) {
            throw std::bad_alloc();
        }
        return static_cast<T*>(p);
    }
    void deallocate(T* p, std::size_t n) {
        // 自定义内存释放逻辑
        std::free(p);
    }
};

// 自定义删除器
template <typename T>
struct MyDeleter {
    void operator()(T* p) const {
        // 自定义对象销毁逻辑
        delete p;
    }
};

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructed" << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructed" << std::endl;
    }
};

int main() {
    // 使用自定义内存分配器和智能指针
    std::unique_ptr<MyClass, MyDeleter<MyClass>> ptr(
        new (MyAllocator<MyClass>().allocate(1)) MyClass(),
        MyDeleter<MyClass>()
    );

    try {
        // 可能抛出异常的代码块
        throw std::runtime_error("Exception occurred");
    } catch (const std::exception& e) {
        std::cerr << "Caught exception: " << e.what() << std::endl;
    }
    // 智能指针会在作用域结束时调用自定义删除器,确保对象正确销毁

    return 0;
}

在上述代码中:

  1. MyAllocator类自定义了内存分配和释放逻辑。
  2. MyDeleter类定义了对象的销毁逻辑。
  3. std::unique_ptr结合自定义删除器MyDeleter,在异常情况下也能保证对象的正确销毁。