遇到一个delete的问题,不知道应如何解释:
char* p=new char[1000];
delete p;
会删除p所指向的内存么?P-1都泄露了,还是全部都泄露了?delete reinterpret_cast<int*>(p),会删除4个字节的内存还是怎么样?int* t=reinterpret_cast<int*>(p);
delete t;为啥会报错?
char* p=new char[1000];
delete p;
会删除p所指向的内存么?P-1都泄露了,还是全部都泄露了?delete reinterpret_cast<int*>(p),会删除4个字节的内存还是怎么样?int* t=reinterpret_cast<int*>(p);
delete t;为啥会报错?
delete t;好使,问题原来是这样的:
int* m;int* t=reinterpret_cast<int*>(p);
m=t;
delete m;出错;
你问 能不能 ?
答:能。再答:最好不要。
比如 char* c = new char('a');
int* p = (int*)c;
delete p; 此处是删除p所指的地址开始的4个字节,而事实上,只有1个字节。
delete p;
会删除p所指向的内存么?P-1都泄露了,还是全部都泄露了?
---------------------
没有泄露,如果不好理解,结合malloc和free想这个问题,free的时候并没有指令要free的大小,实际上,CRT分配的时候你这个指针对应的空间大小已经记录下来了,释放的时候只需要提供指针即可delete [] 比delete会依次对每个元素调用析构,而delete认为只有一个元素,只调用一次析构
对基本类型来说,没有析构函数,但对类来说delete []和delete就完全不一样了总之使用者来说,按规矩办事就好,没必要去冒险
template <typename T>
CMemoryPool<T>::CMemoryPool(size_t linkNumber,size_t linkSize)
{
m_linkNumber = linkNumber>=m_eDefaultLinkNumber?linkNumber:m_eDefaultLinkNumber;
m_linkSize = linkSize>=m_eDefaultLinkSize?linkSize:m_eDefaultLinkSize;
m_nOffset = sizeof(next)+sizeof(last); //真正对象在这两个变量之后 CMemoryPool<T>* runner=reinterpret_cast<CMemoryPool<T>*>(new char[m_linkSize]); head=end=runner; for(size_t n=1;n<linkNumber;n++)
{
runner->next=reinterpret_cast<CMemoryPool<T>*>(new char[m_linkSize]);
runner->next->last=runner;
runner=runner->next;
}
runner->next=head;
head->last=runner;
}template <typename T>
CMemoryPool<T>::~CMemoryPool()
{
CMemoryPool<T>* runner=head;
for(size_t n=0;n<m_linkNumber;)
{
cout<<n<<endl;
runner=head->next;
delete head; //...
head=runner;
n++;
}
}这个delete,每次都使循环直接跳转到下一次,跟continue似的,不知道为什么。。
delete [] a;char * pc = new char [100];
delete pc;char类型是个特例