close、 NULL、elete的具体效果是怎么样的?

来源:百度知道 编辑:UC知道 时间:2024/06/25 01:16:53
VC写一个FTP相关的程序,中断FTP连接时,遇到的问题

1、m_pFtpConnection->Close();
2、m_pFtpConnection=NULL;
3、Delete m_pFtpConnection;
===========================
m_pFtpConnection是一个已经成功的FTP连接,
以上三个语句分别用在什么情况下,什么情况需要配合使用的,尽量回答详细点吧,万分感谢

1只是设用这个对象的一个成员函数来中断连接,但是对象仍未被销毁。
2把一个指针置为空,但对象可能仍未被销毁。
3把一个指针指向的内存释放,但该指针仍然指向一个确定的内存地址。

通常的原则是这样的:

A、在对象的还没有用完之前,不应该把指针置空或者释放内存,否则该对象将不再可用。例如这样的做法是错的:
Delete m_pFtpConnection;
m_pFtpConnection->Close();
这样也是错的
m_pFtpConnection=NULL;
m_pFtpConnection->Close();

B、如果内存已被释放,则要保证*所有*指向该内存的指针为空,否则如果你一不小心使用了这个指针来访问,就会出现内存访问错误,程序会直接越界崩溃。例如下面的做法是错的:
Delete m_pFtpConnection;
m_pFtpConnection->Close();

C、把*所有*指向该内存的指针都置空之前,必须先把该内存释放,否则,该片内存就会处于无管理状态,就是传说中的内存泄露。例如下面的做法是错的:
m_pFtpConnection->Close();
//没有Delete m_pFtpConnection;
m_pFtpConnection=NULL;
同样,反过来说,先置空指针再释放内存也是不正确的,因为这样就相当于让系统帮你释放地址为“0”的内存。例如下面的做法是错的:
m_pFtpConnection=NULL;
Delete m_pFtpConnection;

正确的方法应该这样:
m_pFtpConnection->Close();
Delete m_pFtpConnection;
m_pFtpConnection=NULL;