在 C++ 中,您可以通過重載 operator new
和 operator delete
函數來自定義 new
操作符的行為。這些操作符用于分配和釋放內存。
下面是一個簡單的示例,展示了如何重載 operator new
和 operator 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 new
和 operator delete
函數。當使用 new
關鍵字創建對象時,將調用自定義的 operator new
函數。同樣,當使用 delete
關鍵字刪除對象時,將調用自定義的 operator delete
函數。
請注意,這只是一個簡單的示例,實際上您可能需要處理更復雜的情況,例如重載 operator new[]
和 operator delete[]
以支持數組分配,或者為特定類型的對象提供不同的內存管理策略。