同意
回复人: jaidy(骑士) ( ) 信誉:97 2002-06-05 12:00:00 得分:0
delete pObject!
回复人: jaidy(骑士) ( ) 信誉:97 2002-06-05 12:00:00 得分:0
delete pObject!
解决方案 »
- 关于不规则空间八叉树的创建、使用?
- 软件结束后出现的问题
- 征集新公司名字!!
- 时区问题
- IO模式下,关于数据接收的疑问,简单问题,需要澄清一下!!
- 菜鸟问题 我在onpaint下画线 当话第二条的时候先前画的线就没有了,请问如何解决?请帮帮菜鸟入门。
- 再问:要求client同时和server建立100个sokcet连接(在线等待)
- 结构指针类?大家帮帮忙!再线等待!
- 求多项式相乘的算法!
- 怎样使用帐号远程登录DCOM服务器
- 请问如何能在分屏(CSpliderWnd)中实现将某一view隐藏,然后将旁边的view的高度加大……
- Microsoft OLE DB Provider for ODBC Drivers (0x80004005)问题
delete (ClassA *)p;结果有如何呢?
你删除后最好q=NULL;你对指针的概念不清楚,好好琢磨一下指针的概念
告诉系统内存清除,q重新指向空指针
否则free 就可以了.先把new/delete 和 malloc/free 搞清楚
其实delete在编译时已经根据不同的类型生成不同的代码。
对于void* delete会简单释放内存.
对于ClassA delete还会做一些其它善后处理。可以试验一下(完整的程序):#include <stdio.h>class ClassA
{
public:
int a;
int *p; ClassA()
{
p = new int[4];
} ~ClassA()
{
delete [] p; printf("Go over here!");
getchar();
}
};void main()
{
ClassA* pA = new ClassA;
void* pV = pA; delete pV;//再换成delete pA试试,结果全然不同
}
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <windows.h>class ClassA
{
public:
int x[20];
};void main()
{
ClassA * pObject;
LPVOID p;
pObject = new ClassA[3];
cout<<pObject<<endl;
p = pObject;
delete [](int *)p;
pObject = new ClassA[3];
cout<<pObject<<endl;
delete [] pObject;
}我的观点:
两者效果是一样的,对于delete 操作,我们只要给它一个地址,那么编译器就会很聪明地Free掉你想要Free的内存空间,不错,正像lemon_zc1949(lemon) 所讲的一样:"p中只是保存这地址啊,但不知道内存中的块的大小啊"我当初也存在这样的疑问。
一位网友这样给我解释:你用New分配时,编译会自动用一个字节来记录你这次分配内存的情况,比如:长度等,所以当你用Delete删除时,编译会依据那一个字节的记录信息来智能化地Free内存,这样我们只需要提供一个地址即可而它的类型我们不必关心。
所以我认为:
ClassA * pA = new ClassA;
LPVOID p = pA;
delete pA; and delete p; and delete (ClassA *)p; and delete (int *)p;
是一样的。
原来你不知道"delete pV不调用析构函数,而delete pA要调用"????
delete (ClassA *)pV;
会调用,那当然了!
准确的说,不是delete自动调用了析构函数,对析构函数的调用语句是在编译时由编译器根据具体的指针类型自动加到delete语句之前的。这是一个很大的误区。