求教关于重载delete[]的问题
虽然是老生常谈的问题,但还是有些地方搞不懂
不知道我理解的对不对?请多多指教
做试验发现:(vs2005)
我在重载delete[]操作符的时候,如果给定了第二个参数size_t
那么传递进来的值竟然是sizeof(TYPE),而不是对象数组的长度!!
过程是这样的:
class A
{
public:
A(){cout<<"co"<<endl;a=1.0;};
~A(){cout<<"de"<<endl;};
void* operator new[](size_t size){cout<<size<<endl;return malloc(size);};
void operator delete[](void* p, size_t size){cout << size << endl; free(p);};
double a;
};
int main()
{
class A *pp = new A[3];
delete[] pp;
}
执行输出结果为:
28
co
co
co
de
de
de
8
这个类里面,我重载了new[] 和 delete[] 操作符
很奇怪的是 new[]表达式给 A::operator new[]()传递的参数为 sizeof(A) * 3 + 4
而 delete[]表达式给 A::operator delete[]()传递的参数却是 pp 和 sizeof(A)
我很不理解,为什么传过来的只是一个类对象的大小。我要自己重载内存分配和释放的过程,需要知道完整数组的大小啊!
另外还有一点很重要,我现在开始怀疑编译器在 编译阶段 就知道,delete[] pp 时,需要连续析构3个类对象。
这个“3”不像是从pp指向内存中的某个地方获得的,而是编译器通过什么跟踪机制获得的。