关于new的定位表达式的疑问.
关于new的定位表达式的疑问.
如果申请了一块char*内存, 用char *p指向它, char *p = new char[SIZE];
然后用new的定位表达式将对象全部在p中生成, char *pT = new (p) T[SIZE/20];
那么new出来的对象怎么析构?
用单独先delete掉对象, 然后再delete掉这块p指向的char*的内存吗?
我看C++Primer中写的, 是不用delete掉对象, 直接delete掉char*的内存.
但是如果对象中包含指针数据成员, 可能关联到别的内存区, 也可能关联到系统资源,
那么它们是怎么被析构的?
我写了一段代码, 发现并没有调用析构函数:
//另外, 发现在BCC下没有编译通过, 提示new表达式出错, 提示:Could not find a match for 'operator new[](unsigned int, char *)'
//在GCC(版本3.2.3)下, 也没有通过, 需把int i = sizeof T;这句改成int i = sizeof(T);不清楚为什么.
//VC和VS2003下, 顺利通过.
#include <iostream>
#include <new>
using namespace std;
class T {
public:
T() {
cout<<"T"<<endl;
}
~T() {
cout<<"~T"<<endl;
}
};
int main()
{
int i = sizeof T;
char *p = new char[i * 1000];
T *pT = new (p) T[20];
delete []p;
return 0;
}