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

avatar
作者
猴君
阅读量:0

在 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[] 以支持数组分配,或者为特定类型的对象提供不同的内存管理策略。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!