函数返回值为类指针的实现

返回值为指针ptr的时候,如果指向的区域被销毁,那么ptr就是一个野指针了

内存泄漏
  • 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。 注意:内存泄漏是指堆内存的泄漏。
  • 简单的说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
野指针
  • “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
    1. 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
    2. 指针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;
}
参考

https://blog.csdn.net/yuxikuo_1/article/details/41326899

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值