【发布时间】:2015-07-29 00:24:04
【问题描述】:
考虑下面的代码,它包含一个具有 new 和 new[] 重载的类:
#include <iostream>
class my_class {
public:
my_class() {};
my_class(const my_class& rhs) {};
~my_class() {};
//the constructor also as applicable.
void * operator new(size_t sz);
void * operator new[](size_t sz);
void operator delete(void * ptr);
void operator delete[](void * ptr);
private:
};
void * my_class::operator new(size_t sz)
{
std::cout << "at operator new, sz is: " << sz << std::endl;
}
void * my_class::operator new[](size_t sz)
{
std::cout << "at operator new[], sz is: " << sz << std::endl;
}
void my_class::operator delete(void * ptr)
{
std::cout << "at operator delete, ptr is: " << ptr << std::endl;
}
void my_class::operator delete[](void * ptr)
{
std::cout << "at operator delete[], ptr is: " << ptr << std::endl;
}
int main(int argc, char ** argv)
{
my_class * ptr = new my_class;
my_class * arr_ptr = new my_class[1];
return 0;
}
在终端中运行它(Cygwin)我看到了:
at operator new, sz is: 1
at operator new[], sz is: 9
为什么在调用operator new[] 时是sz == 9?谁设置的?它取决于什么(例如页面大小?)?
【问题讨论】:
-
首先,您的
new实际上应该返回一些东西(而不是NULL)。在那之前,这有 UB。 -
同意,这并不是一个正确的实现,只是对如何计算 size_t sz 的调查