我定义了一个名为MyNewDeleteAllocator的类,并为该类定义了自定义的new和delete运算符。这段代码没有任何错误,可以正常工作。但是,我对代码的第29行有疑问。似乎将“ delete []”更改为“ delete”并不会改变我的代码结果。
[我知道delete(由“ new []”分配的单个对象)和delete [](由“ new []”分配的对象数组)之间的区别。
我想知道为什么在第29行交换delete和delete []不会影响我的结果。
#include <new>
#include <iostream>
using namespace std;
//Allocator class
class MyNewDeleteAllocator {
public:
MyNewDeleteAllocator() {}
~MyNewDeleteAllocator() {}
static void* operator new (size_t size);
static void operator delete (void* p);
};
void* MyNewDeleteAllocator::operator new (size_t size) {
void* p;
p = malloc(size);
if (p == NULL) {
//Throw bad_alloc.
std::bad_alloc exception;
throw exception;
}
cout << "MyNewDeleteAllocator::operator new called with size_t " << size << endl;
return p;
}
void MyNewDeleteAllocator::operator delete (void* p) {
cout << "MyNewDeleteAllocator::operator delete called. " << endl;
delete[] p; //THIS IS LINE 29
}
int main()
{
MyNewDeleteAllocator* p = new MyNewDeleteAllocator; //Create MyNewDeleteAllocator object.
delete p; //Delete MyNewDeleteAllocator object.
return 0;
}
首先,这不是分配器,否则您的名称约定错误。在C ++中,分配器为给定类型而不是原始字节分配内存。有关更多内容-https://en.cppreference.com/w/cpp/memory/allocator
第二,请勿混合使用malloc()
/ delete
和new
/ free()
。 malloc()
应该与free()
一起使用,new
与delete
一起使用,而不是相反。有关更多内容-https://stackoverflow.com/a/20488420/12979560
因此,您要做的就是将malloc()
替换为new
。另外,当您使用new
时,C ++将在无法分配请求的内存的情况下抛出std::bad_alloc
。