一、內存泄漏編程
內存泄漏是指咱們在堆中申請(new/malloc)了一塊內存,可是沒有去手動的釋放(delete/free)內存,致使指針已經消失,而指針指向的東西還在,已經不能控制這塊內存,
因此就是內存泄漏了,看下面的例子。
void remodel(std::string &str)
{
std::string *ps = new std::string(str); //建立了一個局部指針變量,函數調用結束後,指針變量消失,但堆中內存仍然被佔用,沒有被釋放,致使內存泄漏
//內存泄漏了
}
使用完這個變量以後卻沒有及時回收這部分內存,這時咱們就說發生了內存泄露。若是發生了內存泄露又沒有及時發現,隨着程序運行時間的增長,程序愈來愈大,直到消耗完系統的全部內存,而後系統崩潰。
(轉載自:https://blog.csdn.net/zhanghuaichao/article/details/52982687 )
函數
二、內存溢出spa
內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;好比申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。.net
三、野指針
指向一個已刪除的對象或未申請訪問受限內存區域的指針。與空指針不一樣,野指針沒法經過簡單地判斷是否爲 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 )
blog