例如我对TStringList进行创建,发现new返回的地址与缓冲区不符,代码如下
void *p = malloc(sizeof(TStringList));
TStringList* s = new(p)TStringList;
此次单步跟踪得到new返回的地址s的为:00B7AC78,但p的地址为:00B782A0,二者不相等
s->~TStringList();
free(p);

但对AnsiString进行创建的时候,new返回值与缓冲区是一致的。
void *p = malloc(sizeof(String));
String* s = new(p)String;
此次单步跟踪得到new返回的地址s的为:00B76F24,但p的地址为:00B76F24,二者相等
s->~String();
free(p);

VCL是Delphi写的,构造行为和C++不一样
你先看看C++Builder5程序员参考指南.上面关于这部分的内容

引用 2 楼 akirya 的回复:
VCL是Delphi写的,构造行为和C++不一样
你先看看C++Builder5程序员参考指南.上面关于这部分的内容

原来是这样,看来原先在VC下写的一个类是不能够照搬过来用的了,我开始以为是某些VCL类重载了自己的operator new导致这样的结果。。。。我先看看您所提到的书,谢了先 :)

VCL的类,构造顺序同C++类的顺序是反的。VCL类先构造祖先,然后逐步构造到你要实例的类。
如果要实现类似的构造方式,你可以使用HeapAlloc先申请内存,每次在内存中分配对象。

引用 4 楼 yuanreid 的回复:
VCL的类,构造顺序同C++类的顺序是反的。VCL类先构造祖先,然后逐步构造到你要实例的类。
如果要实现类似的构造方式,你可以使用HeapAlloc先申请内存,每次在内存中分配对象。

明白了,多谢!!