首页 > 系统相关 >return new 内存泄漏

return new 内存泄漏

时间:2023-09-01 15:25:45浏览次数:58  
标签:aa return bb nullptr 内存 new delete

样例如下:

#include <iostream>

class B
{
public:
    int Fun()
    {
        return 100;
    }
}

class A
{
public:
    B* CreateB()                    //new了个B对象
    {
        return new B();
    }
}

int main()
{
    A *aa=new A();
    std::cout<<A->CreateB()->Fun(); //new的B对象没有被delete掉,内存泄漏

    delete aa;
    aa=nullptr;

    return 0;
}

解决方式:

1、方式一

智能指针【推荐此方式】

#include <memory>               //for unique_ptr

class A
{
public:
    std::unique_ptr<B> CreateB()                    //new了个B对象
    {
        std::unique_ptr<B> up_b(new B());           //使用智能指针,会自动释放资源
        return up_b;
    }
}

2、方式二

再写个删除函数

class A
{
public:
    B* CreateB()                    //new了个B对象
    {
        return new B();
    }
    void DeleteB(B** pObj)          //释放B对象
    {
        if(pObj!=nullptr && *pObj!=nullptr)
        {
            delete *pObj;
            *pObj=nullptr;
        }
    }
}

int main()
{
    A *aa=new A();
    B *bb=aa->CreateB();    //其中new了个B对象
    std::cout<<bb->Fun(); 

    aa->DeleteB(&bb);       //释放B对象

    delete aa;
    aa=nullptr;

    return 0;
}

3、方式三

int main()
{
    A *aa=new A();
    B *bb=aa->CreateB();    //其中new了个B对象
    std::cout<<bb->Fun(); 

    delete bb;              //释放B对象
    bb=nullptr;
    delete aa;
    aa=nullptr;

    return 0;
}

 

标签:aa,return,bb,nullptr,内存,new,delete
From: https://www.cnblogs.com/xixixing/p/17671964.html

相关文章

  • 243.mysql 内存统计相关
    1.查看mysql是否打开了关于innodb内存相关的监控SELECT*FROMperformance_schema.setup_instrumentsWHERENAMELIKE'%memory/innodb%';2.没有打开的话开一下(自己判断:重启数据库会恢复原有设置)#updateperformance_schema.setup_instrumentssetenabled='yes'wher......
  • newtonsoft.json
    https://www.newtonsoft.com/jsonProductproduct=newProduct();product.Name="Apple";product.Expiry=newDateTime(2008,12,28);product.Sizes=newstring[]{"Small"};stringjson=JsonConvert.SerializeObject(product);//{......
  • 存储过程Select/Return/Output与Dapper对应关系
    存储过程:ALTERPROCEDURE[dbo].[usp_test]@testintoutputASBEGINselect@test=12;select11;END对应关系:1.参数out,output均可以,都对应Dapper:parameters.Add("@test",dbType:DbType.Int32,direction:ParameterDirection.Output);intm2=parameters.Get......
  • Android内存优化的背景
    一、Android内存管理机制Android系统在运行时使用内存管理机制来分配和回收内存,以确保应用程序在合适的内存限制下运行,并优化系统资源的使用效率。Android系统中有不同类型的内存区域,每个区域都有不同的作用。Java堆(JavaHeap):Java堆是用于分配Java对象的主要内存区域。Android应用......
  • svchost.exe占用内存过高--(windows update检查更新时一直处于正在检查)
    1.打开任务管理器-进程,找到svchost对应占用内存过高对应PID值例如:60982.打开任务管理器-服务,查找PID为6098的服务,如果是windowsupdate引起的则操作以下步骤 1)右击windowsupdate-属性设为停止 2)C:\windows\softwaredistribution删除里面......
  • 内存分区模型
    1内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收......
  • 记录--解决前端内存泄漏:问题概览与实用解决方案
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助内存泄漏是前端开发中的一个常见问题,可能导致项目变得缓慢、不稳定甚至崩溃。在本文中,我们将深入探讨在JavaScript、Vue和React项目中可能导致内存泄漏的情况,并提供详细的代码示例,以帮助开发人员更好地理解和解决这......
  • newInstance() 和 new 有什么区别
    在初始化一个类,生成一个实例的时候,有newInstance()和new两种方式。用newInstance与用new是区别的,区别在于创建对象的方式不一样。前者是使用类加载机制,后者是使用反射机制。Java中工厂模式经常使用newInstance来创建对象,如:Classc=Class.forName(“A”);factory=(AInterface......
  • 关于Newtonsoft.Json的随笔
    在工作中一些陈旧项目,难免引用了一些很老版本,在一次升级中,项目引用的Newtonsoft.Json.dll突然少了一些method和class1,原来的:(咱也不懂为啥没有版本号嘞 2,升级后的 问题:1,原来使用的函数不存在,但是其实还在,换地方了而已,以下是修改:Newtonsoft.Json.JavaScriptConvert.Seria......
  • Linux中Cache内存占用过高解决办法
    https://zhuanlan.zhihu.com/p/200833204一、概述在日常运维中,我们会发现主机内存使用告警,为什么Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做CacheMemory。有时候你会发现没有什么程序在运行,但是使用top......