C/C++中內存泄漏、內存溢出與野指針的解釋與說明


1、內存泄漏

內存泄漏是指我們在堆中申請(new/malloc)了一塊內存,但是沒有去手動的釋放(delete/free)內存,導致指針已經消失,而指針指向的東西還在,已經不能控制這塊內存,

所以就是內存泄漏了,看下面的例子。

void remodel(std::string &str)
{
    std::string *ps = new std::string(str);  //創建了一個局部指針變量,函數調用結束后,指針變量消失,但堆中內存仍然被占用,沒有被釋放,導致內存泄漏
    //內存泄漏了
}
使用完這個變量之后卻沒有及時回收這部分內存,這時我們就說發生了內存泄露。如果發生了內存泄露又沒有及時發現,隨着程序運行時間的增加,程序越來越大,直到消耗完系統的所有內存,然后系統崩潰。
(轉載自:https://blog.csdn.net/zhanghuaichao/article/details/52982687 )

2、內存溢出

內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出

 

3、野指針
指向一個已刪除的對象或未申請訪問受限內存區域的指針。與空指針不同,野指針無法通過簡單地判斷是否為 NULL避免,而只能通過養成良好的編程習慣來盡力減少。對野指針進行操作很容易造成程序錯誤。
a.指針變量未初始化
任何指針變量剛被創建時不會自動成為NULL指針,它的缺省值是隨機的,它會亂指一氣。所以,指針變量在創建的同時應當被初始化,要么將指針設置為NULL,要么讓它指向合法的內存。

b.野指針指針釋放后之后未置空
有時指針在free或delete后未賦值 NULL,便會使人以為是合法的。別看free和delete的名字(尤其是delete),它們只是把指針所指的內存給釋放掉,但並沒有把指針本身干掉。此時指針指向的就是“垃圾”內存。釋放后的指針應立即將指針置為NULL,防止產生“野指針”。

c.野指針指針操作超越變量作用域
不要返回指向棧內存的指針或引用,因為棧內存在函數結束時會被釋放。示例程序如下:
class A {
public:
  void Func(void){ cout << “Func of class A” << endl; }
};
class B {
public:
  A *p;
  void Test(void) {
    A a;
    p = &a; // 注意 a 的生命期 ,只在這個函數Test中,而不是整個class B
  }
  void Test1() {
  p->Func(); // p 是“野指針”
  }
};

由於a的生命周期是在void Test(void)函數結束時就應該被釋放,所以你再引用指針p的時候它指向的內存已經被釋放了,所以p已經是野指針了。

(轉載自:https://blog.csdn.net/zhanghuaichao/article/details/52982687 )



免責聲明!

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



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