【发布时间】:2020-05-28 22:06:01
【问题描述】:
我定义了一个名为 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;
}
【问题讨论】:
-
第29行是哪一个?
-
您将
malloc与delete[]混合在一起 - 这已经是未定义的行为 -
第 29 行是删除操作符实现的最后一行
-
你的
operator new返回一个指向用malloc分配的内存的指针——你的operator delete试图通过调用delete[]来释放内存 -
@JohnLee 因为程序的行为未定义。
标签: c++ memory-management delete-operator