首页 > 系统相关 >引用个数为什么会影响内存泄漏 c++例子

引用个数为什么会影响内存泄漏 c++例子

时间:2024-07-05 20:31:38浏览次数:9  
标签:泄漏 ClassB c++ ClassA 引用 new delete 内存

在C++中,内存泄漏通常与手动管理内存有关,而不是直接由引用计数引起,因为C++标准库本身并不提供自动的引用计数功能。但是,我们可以通过一个例子来间接说明引用(或指针)管理不当如何导致内存泄漏,尤其是当涉及复杂对象结构和所有权关系时,这种管理不当往往体现在循环引用上。

基本概念

在C++中,如果一个对象分配在堆上(通过new操作符),则必须手动使用delete来释放其内存。忘记释放分配的内存就会导致内存泄漏。

循环引用示例

假设我们有两个类,ClassAClassB,它们互相持有对方的指针,形成了一个循环引用的情况

1class ClassA {
2public:
3    ClassB* b;
4    ClassA(ClassB* _b) : b(_b) {}
5    ~ClassA() { delete b; } // 这里试图解决循环引用,但会导致错误的释放或双删
6};
7
8class ClassB {
9public:
10    ClassA* a;
11    ClassB(ClassA* _a) : a(_a) {}
12    ~ClassB() { delete a; } // 同样,这里的问题也是错误的释放或双删
13};
14
15int main() {
16    ClassA* a = new ClassA(nullptr);
17    ClassB* b = new ClassB(a);
18    a->b = b; // 形成循环引用
19
20    // 此时,即使main函数结束,a和b也不会被释放,因为它们互相引用,且没有地方去删除它们

标签:泄漏,ClassB,c++,ClassA,引用,new,delete,内存
From: https://blog.csdn.net/jijie_ming/article/details/140217500

相关文章

  • C++实现计算程序运行的时间
    在C++中,计算程序运行时间可以使用多种方法,其中<chrono>库提供了精确的时间测量功能,适用于C++11及更高版本。以下是一个简单的示例,展示如何使用std::chrono来计算程序运行时间:#include<iostream>#include<chrono>intmain(){  //获取程序开始执行的时间点  au......
  • C++ 基础的输入输出介绍
    C++基础的输入输出介绍在C++编程的世界中,输入输出是连接程序与用户界面的桥梁,是实现人机交互不可或缺的部分。对于初学者而言,掌握C++中基本的输入输出方式——使用cin进行输入和使用cout进行输出,是踏入C++编程大门的第一步。本文将详细介绍如何在C++程序中利用cin和cout来......
  • C++ UTF-8编解码
    icu编解码数据:externconstUConverterSharedData  _MBCSData,_Latin1Data,  _UTF8Data,_UTF16BEData,_UTF16LEData,_UTF32BEData,_UTF32LEData,  _ISO2022Data,   _LMBCSData1,_LMBCSData2,_LMBCSData3,_LMBCSData4,_LMBCSData5,_LMBCSData6......
  • C++——模板详解(下篇)
    一、非类型模板参数模板参数分为类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之后的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。namespaceH{//定义一个模板类型的......
  • C++list的模拟实现
    链表节点 template<classT> structListNode { ListNode(constT&data=T()) : _data(data) { } ListNode<T>*_prev=nullptr; ListNode<T>*_next=nullptr; T_data; };因为之后要访问这个类的成员变量函数和结构体,所以在这里将class直接改为struct......
  • Linux 交叉编译(toolchain) ARM aarch64版 libc++.so 库
    前言全局说明libc++源码libc++是LLVM项目提供的一个C++标准库的实现,它是KonaKart等项目的基础。由于libc++是开源>的,因此您可以在其官方仓库中找到源代码。一、说明如果您想要阅读libc++的源代码,可以按照以下步骤进行:访问libc++的官方GitHub仓库:https://github.com/llv......
  • C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结
    C++结构体C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中的const的使用场景,以及结构体的案例。1.结构体的定义和使用结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。......
  • 内存映射
    mmap内存映射函数(显示图片的新方法)----也是Linux系统IO中的函数之一基本概念系统IO函数的共同点:就是他们的形参中一定有一个是文件描述符(除open)。内存映射的意思:拆内存:普通运存,显存(集显和独显),是一块内存空间,存放显示画面的像素点。映射:两个集合中的元素,都具有......
  • C++基础语法篇
    一、语法1.定义变量并赋值:数据类型 变量名=值;2.宏常量定义#define会报错,提示转换:constexprauto数据类型常量名=常量值;3.定义普通(局部)常量:const 数据类型常量名=常量值;4.sizeof关键字,查询占用空间 sizeo......
  • C++ 类型转换注意事项总结
    在C++中,类型转换是编程过程中不可避免的一部分,但不当的类型转换可能会导致程序错误、数据损坏甚至程序崩溃。因此,了解类型转换的注意事项至关重要。以下是C++类型转换时需要注意的几个方面:1.区分隐式类型转换和显式类型转换隐式类型转换:由编译器自动完成,无需程序员干预。......