operator new operator delete
时间: 2024-05-30 12:07:15 浏览: 118
operator new和operator delete是C++中的内存分配和释放函数。它们可以用来为对象和数组动态分配内存,也可以用来进行其他需要动态分配内存的操作。
operator new函数用于动态分配内存,它可以接受一个或两个参数。第一个参数表示要分配的内存大小,第二个参数表示对齐方式。operator new函数会返回指向分配的内存块的指针。
operator delete函数用于释放由operator new分配的内存块,它可以接受一个或两个参数。第一个参数表示要释放的内存块的指针,第二个参数表示对齐方式。
需要注意的是,使用operator new和operator delete函数进行内存分配和释放时,需要手动调用构造函数和析构函数。因为这些函数只会分配或释放内存,不会调用构造函数或析构函数。
相关问题
#include <iostream> #include <cstdlib> class MyClass { public: void* operator new(std::size_t size) { std::cout << "Custom new operator called, size = " << size << std::endl; return std::malloc(size); } void operator delete(void* ptr) noexcept { std::cout << "Custom delete operator called" << std::endl; std::free(ptr); } void* operator new[](std::size_t size) { std::cout << "Custom new[] operator called, size = " << size << std::endl; return std::malloc(size); } void operator delete[](void* ptr) noexcept { std::cout << "Custom delete[] operator called" << std::endl; std::free(ptr); } // 构造函数和析构函数略 }; int main() { MyClass* p = new MyClass(); delete p; MyClass* arr = new MyClass[10]; delete[] arr; return 0; } 在这段代码中如何给delete加打印文件名称的功能
要在 delete 中添加打印文件名称的功能,可以使用宏定义的方式,在 delete 操作时调用自定义的 delete 函数。具体实现如下:
```
#include <iostream>
#include <cstdlib>
#define DELETE_WITH_INFO(ptr) CustomDelete(ptr, __FILE__, __LINE__)
void CustomDelete(void* ptr, const char* file, int line) noexcept {
std::cout << "Custom delete operator called from " << file << " line " << line << std::endl;
std::free(ptr);
}
class MyClass {
public:
void* operator new(std::size_t size) {
std::cout << "Custom new operator called, size = " << size << std::endl;
return std::malloc(size);
}
void operator delete(void* ptr) noexcept {
DELETE_WITH_INFO(ptr);
}
void* operator new[](std::size_t size) {
std::cout << "Custom new[] operator called, size = " << size << std::endl;
return std::malloc(size);
}
void operator delete[](void* ptr) noexcept {
DELETE_WITH_INFO(ptr);
}
// 构造函数和析构函数略
};
int main() {
MyClass* p = new MyClass();
DELETE_WITH_INFO(p);
MyClass* arr = new MyClass[10];
DELETE_WITH_INFO(arr);
return 0;
}
```
在 delete 操作时使用 DELETE_WITH_INFO 宏代替 delete 操作即可。该宏会调用 CustomDelete 函数,该函数会打印文件名称和行号,并调用 std::free() 函数释放内存。
c++ new 和operator new
C++中的new和operator new是用于动态分配内存的操作符。
new操作符在使用时会先调用operator new函数分配内存,然后调用构造函数初始化对象。这个过程可以简化为:
```cpp
T* obj = new T(args);
```
这里的T是要分配内存的对象类型,args是传递给构造函数的参数。new操作符返回一个指向分配的内存的指针。
operator new函数负责分配内存,并返回指向分配内存的指针。其原型如下:
```cpp
void* operator new(std::size_t size);
```
其中,size是需要分配的内存大小。
相对应地,delete操作符用于释放通过new操作符分配的内存,它会先调用析构函数销毁对象,然后调用operator delete函数释放内存。可以简化为:
```cpp
delete obj;
```
operator delete函数负责释放通过new操作符分配的内存,其原型如下:
```cpp
void operator delete(void* ptr);
```
总结:new和operator new联合使用可以方便地分配和释放内存,并进行对象的初始化和析构操作。
阅读全文