一、内存泄漏编程
内存泄漏是指咱们在堆中申请(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