內存知識的積累
有關內存的思考題(積累中)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
請問運行Test 函數會有什麽樣的結果?
答:程序崩潰。
因為GetMemory 並不能傳遞動態內存,
Test 函數中的 str 一直都是 NULL。
strcpy(str, "hello world");將使程序崩
潰。
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請問運行Test 函數會有什麽樣的結果?
答:可能是亂碼。
因為GetMemory 返回的是指向“棧內存”
的指針,該指針的地址不是 NULL,但其原
現的內容已經被清除,新內容不可知。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory2(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運行Test 函數會有什麽樣的結果?
答:
(1)能夠輸出hello
(2)內存泄漏 ,可以改成strcpy_s就行了不?
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問運行Test 函數會有什麽樣的結果?
答:篡改動態內存區的內容,後果難以預
料,非常危險。
因為free(str);之後,str 成為野指針,
if(str != NULL)語句不起作用。
2.關於內存泄露
在計算機科學中,內存泄漏指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存泄漏並非指內存在物理上的消失,而是應用程序分配某段內存後,
由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。內存泄漏與許多其他問題有著相似的癥狀,並且通常情況下只能由那些可以獲得程序源代碼的程
序員才可以分析出來。然而,有不少人習慣於把任何不需要的內存使用的增加描述為內存泄漏,即使嚴格意義上來說這是不準確的。
一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完後必須顯示釋放的內存。
應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存
塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。
內存知識的積累