四十. 建構函式的初始化列表1
#include using namespace std;
class a
~abcd()
int geta()
private:
int _a;
int _b;
int _c;
};class mye
mytest(int a, int b)
~mytest()
int * array_p = (int*) malloc(sizeof(int) *10);
for(int i = 0; i<10; i++)
for(int i = 0;i<10;i++)
}//c++中
void test2()
int *array_p = new int[10];
for(int i = 0; i<10; i++)
for(int i = 0;i<10;i++)
cout四十五.new和delete2
這裡,我們必須對《new與malloc》,《delete與free》這兩組關係有比較清晰的認識
delete tp釋放的是tp本身,而析構函式,是用來析構new出來的空間。
delete也是類似,delete會做的事,事先去觸發析構函式,再去銷毀物件。而與此同時,free本身,只是去銷毀物件,釋放空間。它缺了delete的第一步。
2. 基於上述原因,我們需要掌握delete與delete之間的區別
int *a = new int[10];
delete a;//正確
<=>等價於
delete a;//正確
#include ;
using
namespace
std;
int main()
=>01294750
釋放了a1的空間
01294750
釋放了a2的空間
注:此種情況中的釋放效果相同,原因在於:分配簡單型別記憶體時,記憶體大小已經確定,系統可以記憶並且進行管理,在析構時,系統並不會呼叫析構函式。
t *a = new t[10];
delete a;//錯誤,僅釋放了a指標指向的全部記憶體空間 但是只呼叫了a[0]物件的析構函式,剩下的從a[1]到a[9]這9個使用者自行分配的對應記憶體空間將不能釋放 從而造成記憶體洩漏。
效果截然不同
delete a;//正確,呼叫使用類物件的析構函式釋放使用者自己分配記憶體空間並且釋放了a指標指向的全部記憶體空間
錯誤程式示例:
#include ;
using
namespace
std;
class t
=>構造t
構造t構造t
010f4754
析構t程式崩潰了debug assertion failed!
expression:_block_type_is_valid(phead->nblockuse)
正確程式示例:
#include ;
using
namespace
std;
class t
=>構造t
構造t構造t
1664754
析構t析構t
析構t釋放了p1空間
構造t構造t
構造t1664754
析構t析構t
析構t釋放了p2空間
注:在用這些類生成物件陣列的時候,用delete來釋放它們才是王道。
(3)總結,別管那麼多,反正如果定義的事單個個體,就delete。
如果定義的是陣列,就delete,這樣絕對不會出錯
2017C 基礎 網課筆記(5到9)
五.三目運算子的加強 c 中,三目運算子可以作為左值使用,而在c中,三目運算子只可當作右值,不可當作左值。include using namespace std void test1 int a 10 int b 20 int c 0 c a六.const的增強 關於const不同位置的修飾含義 當...
2017C 基礎 網課筆記(10到14)
十.引用的本質 1.引用所占用的大小,跟指標是相等的。2.常量需要初始化,引用也要初始化,引用可能本質上是一常量 十一.常量指標 對於 int array 10 array是位於 常量區 的。而int r a 而言,r也是位於常量區,它的 r指向a 十二.引用作為函式的返回值 include usi...
2017C 基礎 網課筆記(59到62)
五十九.友元類和友元的關係性質 include using namespace std class a void printa void printb void printcomplex complex operator complex another 注意operator與後面的操作符,必須中間沒...