c++中delete和析構函數之間的區別


delete=1.調用析構函數,釋放對象中的成員資源

            2.歸還對象空間(free)

其中在調用析構函數的時候,有可能還會對其他對象進行delete,然后調用這個對象的析構函數。。。

看這個例子:

轉載原文地址:

https://www.cnblogs.com/wycnb/p/4664934.html

delete用於釋放new在堆中動態生成的對象空間。
釋放時會自動調用類的析構函數,在析構函數中用於釋放類內部動態分配的得到的資源。

然后delete再釋放整個對象所占的內存空間
simple:
#include <iostream>
using std::cout;
using std::endl;
class Simple{
public:
Simple(){
p = new int; //使用new分配空間
*p = 10;
pArray = new int[*p]; //使用new分配數組空間
for(int i = 0; i < *p; i++)
pArray[i] = i;
}
~Simple(){
cout << "\ndisconstuctor\n" << "now delete p" << endl;
delete p;
cout << "now delete pArray" << endl;
delete [] pArray; //注意這里的釋放配對
}
public:
void out(){
cout << "p value = " << *p << endl;
for(int i = 0; i < *p; i++)
{
cout << "array is " << *(pArray + i) << endl;
}
}
private:
//disable copy & assign control
Simple(const Simple&);
const Simple& operator=(const Simple&);
private:
int *p;
int *pArray;
};
int main()
{
Simple* s = new Simple; //生成堆對象
s->out();
delete s; //釋放對象

//delete s的過程中首先調用析構函數~simple()釋放成員資源,然后釋放對象的空間

//在~simple()的過程中:因為simple()的過程中,有開辟新空間,所以這個必須delete,如果這個過程中沒有new,那么這里也沒必要delete,在這個delete的過程中,也調用了int這個類的析構函數,在int這個類里的析構函數中,首先釋放成員資源,然后釋放空間,當整個對象中的成員資源被釋放之后,等於是該對象的析構函數執行完畢。然后delete釋放整個對象的空間。


return 0;
}

而delete this如果發生在析構函數中,每次delete---->調用析構函數,析構函數又delete this導致了堆棧內存。。。

如果是發生在成員函數中,之后如果不用到成員資源(比如某個成員變量和虛函數)可以,如果用到,會報錯,因為這塊資源已經被釋放掉,找不到數據了。


原文:https://blog.csdn.net/chengchaonan/article/details/89816316


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM