c++內存管理

  一直覺得內存管理是個大頭,c語言裏面最大兩個問題,內存管理和指針,到了c++,內容就比較精彩了,也無外乎四個東西,內存管理,指針,設計模式,泛型。下面就第一個說說值得注意的東西吧

 (1)c語言中四個存儲的區域,本blog的上一篇文章即是轉載他人的相關文章,比較了堆和棧的區別,並加入了少量本人的註釋
 (2)內存泄露(free,delete)、內存區域未初始化(隨機,非爲0)、內存越界(申請內存未成功、野指針和數組越界)的問題
 (3)數組和指針的對比

 其實高質量c/c++編程裏面有詳細的講述,也可以見如右的網頁:c++內存管理

 下面是我的相關注釋

char *p="hello";
p[0]='X';
printf("%s",p);
//strcmp就相當於把二者指針的內容相減
原型:extern int strcmp(const char *s1,const char * s2);
所在頭文件:string.h
功能:比較字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)
說明:
當s1<s2時,返回值= -1
當s1==s2時,返回值= 0
當s1>s2時,返回值 = 1

   ps:sizeof(1)數組和指針

   參考網址:sizeof()用法彙總
    sizeof(p)其中p是指針,所有指針變量的sizeof 操作結果均爲4

sizeof(a)其中a是數組名,這就要分兩種情況:a是作爲函數參數,退化爲指針,爲4,但是如果是一般情況,那就是整個數組佔多大就是多大

比較經典的辨析題

      double* (*a)[3][6]; 
      cout<<sizeof(a)<<endl; // 4 a爲指針
      cout<<sizeof(*a)<<endl; // 72 *a爲一個有3*6個指針元素的數組
      cout<<sizeof(**a)<<endl; // 24 **a爲數組一維的6個指針
      cout<<sizeof(***a)<<endl; // 4 ***a爲一維的第一個指針
      cout<<sizeof(****a)<<endl; // 8 ****a爲一個double變量

           數組也是一個指針,沒加上一個*實際維數就減少1,特別在多維數組裏面更明顯,在上面,a是一個二維數組指針(a前面的*決定的),並且這個二維數組是一個指針數組(這是由於double後面的*決定的),那麼,總共算起來從內層到外層就有四個*(本來內外各一個,再加上二維就是4個,而且蛻皮的順序也是由內而外)

sizeof short:2

sizeof long:4
sizeof float:4

sizeof WORD:2

sizeof DWORD:4

原因

WINDEF.H的定義

typedef unsigned long       DWORD;

typedef int                 BOOL;

typedef unsigned char       BYTE;

typedef unsigned short      WORD;

再ps下,上訴網頁中關於最後sizeof(s4)作者的判斷有誤,爲24

再再ps:發現上面的講訴缺了點神馬,然後再引述一個sizof函數的相關網頁

 size_t sz = sizeof( foo() ); // foo() 的返回值類型爲char,所以sz = sizeof( char ),foo()並不會被調用

C99標準規定,函數、不能確定類型的表達式以及位域(bit-field)成員不能被計算sizeof值,即下面這些寫法都是錯誤的:

sizeof( foo ); // error
void foo2() { }
sizeof( foo2() ); // error,沒有返回值
設置沒有對其的命令#pragma pack(2) // 必須在結構體定義之前使用
這個#pragma命令又有點說頭了:#pragma百度百科
其中作者用過的兩種:
一種是加載dll文件 #pragma comment(dll,"a.dll"),還有#pragma once

(4)指針傳遞內存

void GetMemory(char *p, int num)
{
	p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
	char *str = NULL;
	GetMemory(str, 100); // str 仍然爲 NULL
	strcpy(str, "hello"); // 運行錯誤
}//上述無法得到內存,由於傳遞不是指針的指針
void GetMemory2(char **p, int num)
{
	*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
	char *str = NULL;
	GetMemory2(&str, 100); // 注意參數是 &str,而不是str
	strcpy(str, "hello");
	cout<< str << endl;
	free(str);
}



 

 
發佈了31 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章