温馨提示×

如何自定义C++中new()的行为

c++
小樊
82
2024-09-06 07:18:20
栏目: 编程语言

在 C++ 中,您可以通过重载 operator newoperator delete 函数来自定义 new 操作符的行为。这些操作符用于分配和释放内存。

下面是一个简单的示例,展示了如何重载 operator newoperator delete 以跟踪内存分配:

#include<iostream>
#include <cstdlib> // for std::size_t

// 自定义 operator new
void* operator new(std::size_t size) {
    std::cout << "Custom new: allocating "<< size << " bytes"<< std::endl;
    void* ptr = std::malloc(size);
    if (ptr == nullptr) {
        throw std::bad_alloc();
    }
    return ptr;
}

// 自定义 operator delete
void operator delete(void* ptr) noexcept {
    std::cout << "Custom delete: freeing memory at "<< ptr<< std::endl;
    std::free(ptr);
}

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructor"<< std::endl;
    }

    ~MyClass() {
        std::cout << "MyClass destructor"<< std::endl;
    }
};

int main() {
    try {
        MyClass* obj = new MyClass();
        delete obj;
    } catch (const std::bad_alloc& e) {
        std::cerr << "Allocation failed: " << e.what()<< std::endl;
    }

    return 0;
}

在这个示例中,我们重载了全局的 operator newoperator delete 函数。当使用 new 关键字创建对象时,将调用自定义的 operator new 函数。同样,当使用 delete 关键字删除对象时,将调用自定义的 operator delete 函数。

请注意,这只是一个简单的示例,实际上您可能需要处理更复杂的情况,例如重载 operator new[]operator delete[] 以支持数组分配,或者为特定类型的对象提供不同的内存管理策略。

0