要想弄清楚,看文档(ABI)、源码、下断点单步跟踪、看反汇编,都行。在non-trivial destructor的情况下...
通过观察"new"调用了HeapAlloc函数,而这一函数使用可以将内存分配情况用结构体保存起来,"delete"估计就是通过这一结构体得到数组大小的。也就是说C++这一语法特点是借用了HeapAlloc等函数对Windows堆内存的管理方式实现的。 未知&待研究: scalar "new" 与 vector "delete []"出现不匹配的使用时究竟会不会出现问题 ...
在VC 上,是通过第一种方式记录的,即:VC对于数组的大小信息存放在:"数组首地址 - 4 * sizeof(int)"之中,我们可以添加以下代码: cout<<"begin print size ="<< *reinterpret_cast<int*>(reinterpret_cast<char*>(buf) -4*sizeof(int))<<endl; 在这里你可以更改前面代码*buf指针所指向数组初始化时的大...
它会删除一个9号的数组。 它删除指针指向的数组。 未指定如何存储大小信息,因此每个编译器可以以不同...
要想弄清楚,看文档(ABI)、源码、下断点单步跟踪、看反汇编,都行。在non-trivial destructor的情况下...
delete[]可以有无穷种方法来实现 new/malloc是资源管理器,交给用户的既是一个内存地址,同时也是一个...
alignment.//这儿就像它所说的那样public:staticvoid*allocate(size_t__n){//这里实际申请的内存大小...
我们可以看到到指针buf指向的数组大小只有4个字节,但是如果只delete 这四个以分配好的字节空间应该也不会有问题啊,肯定有什么地方给扰乱了。 第三个问题:那编译器是怎么知道这个数组大小的? 这个问题承接第二个问题,因为通过指针我们是没法知道它所指向的对象的大小的。
char*s_;};intmain(){T*d=newT[3];cout<<sizeof(*d)<<endl;int*p=(int*)d;delete[]d;}...