返回值为指针ptr的时候,如果指向的区域被销毁,那么ptr就是一个野指针了
内存泄漏
- 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。 注意:内存泄漏是指堆内存的泄漏。
- 简单的说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
野指针
- “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
- 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
- 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块
在使用指针的时候还要注意的问题:
- 不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放.
- 在使用指针进行内存操作前记得要先给指针分配一个动态内存。
- 如果必须用返回值为指针的话,可以用static
代码
A.h
#ifndef TESTA_A_H
#define TESTA_A_H
#include <stdio.h>
#include <iostream>
class A {
public:
A(int aa){
a = aa;
std::cout << " A created" << std::endl;
}
virtual ~A() {
std::cout << " i am ~A " << std::endl;
}
virtual int APconfig() = 0;
int a;
};
#endif //TESTA_A_H
B.h
//
// Created by jiao.lu on 2019/5/17.
//
#ifndef TESTA_B_H
#define TESTA_B_H
#include "A.h"
class B : public A {
public:
B(int bb):A(10){
b = bb;
std::cout << " B created" << std::endl;
}
~B() {
std::cout << " i am ~B " << std::endl;
}
virtual int APconfig()
{
std::cout << " B -- APconfig" << std::endl;
};
int b;
};
#endif //TESTA_B_H
main.cpp
#include <iostream>
#include "b.h"
A*Get()
{
A *ptr = nullptr;
static B b1 = B(2);
ptr = &b1;
// ptr->APconfig();
return ptr;
}
int main() {
// A *ptr = nullptr;
//
// Get(ptr);
A *ptr = Get();
if(ptr == nullptr)
{
std::cout << "nullptr" << std::endl;
}
ptr->APconfig();
std::cout << "Hello, World!" << std::endl;
return 0;
}