C/C++的常见内存问题

1 内存泄漏:动态分配的内存没有被正确释放,导致程序持续占用内存直至结束运行。
Example:
 

void memoryLeakExample() {int* ptr = new int(5); // 分配了一个int类型的内存// 这里没有调用delete来释放内存
}

solution:
    自己delete或者使用智能指针


智能指针内存泄露的情况:
假设我们有两个类A和B,它们相互引用对方的实例,使用std::shared_ptr进行管理。这种情况下,如果不加以处理,就会导致循环引用和内存泄漏。

#include <memory>class B; // 前置声明class A {
public:std::shared_ptr<B> bPtr;// ...
};class B {
public:std::shared_ptr<A> aPtr;// ...
};int main() {std::shared_ptr<A> a = std::make_shared<A>();std::shared_ptr<B> b = std::make_shared<B>();a->bPtr = b;b->aPtr = a;// 此时a和b相互引用,会导致循环引用和内存泄漏return 0;
}

solution:
为了解决这个问题,我们可以使用std::weak_ptr来打破循环引用:

#include <memory>class B; // 前置声明class A {
public:std::shared_ptr<B> bPtr;// ...
};class B {
public:std::weak_ptr<A> aWeakPtr; // 使用weak_ptr来打破循环引用// ...
};int main() {std::shared_ptr<A> a = std::make_shared<A>();std::shared_ptr<B> b = std::make_shared<B>();a->bPtr = b;b->aWeakPtr = a; // 使用weak_ptr// 现在循环引用被打破,不会导致内存泄漏return 0;
}

通过将B类中的aPtr改为std::weak_ptr,我们成功打破了循环引用,避免了内存泄漏问题


2 二次释放:尝试释放已经被释放的内存,可能导致程序崩溃。
Example:

int main() {int* ptr = new int(5); // 分配了一个int类型的内存delete ptr; // 释放内存delete ptr; // 尝试再次释放同一块内存,这是错误的return 0;
}


solution:
   我们需要确保在释放内存后将指针置为nullptr,这样可以避免尝试释放已经被释放的内存。另外,使用智能指针(如std::unique_ptr)


3 悬空指针:指针指向的内存已经被释放,将指针置为nullptr,导致潜在的错误访问。

int* ptr = new int(5); // 分配了一个int类型的内存
delete ptr; // 释放内存
ptr = nullptr; // 将指针置为空指针
// 在之后的代码中,错误地使用了已经被释放的指针
int value = *ptr; // 这里访问了一个已经被释放的内存

solution:

    多做if  (ptr != nullptr)判断


4 内存越界访问:访问超出动态分配内存范围的内存,可能导致未定义行为。

int* arr = new int[5]; // 分配了包含5个int的内存块// 尝试访问超出分配内存范围的内存
arr[5] = 10; // 这里访问了arr数组中超出范围的内存delete[] arr; // 释放内存

solution:
我们需要确保在访问动态分配的内存时不要超出其范围。另外,可以使用标准库提供的容器类(
如std::vector)来代替手动管理动态数组,这样可以避免手动管理内存时可能出现的问题。


5 不正确的所有权管理:多个指针指向同一块动态分配的内存,但没有正确管理所有权,可能导致资源释放错误或重复释放。

int* ptr1 = new int(5); // 分配了一个int类型的内存
int* ptr2 = ptr1; // ptr2指向了ptr1所指向的内存delete ptr1; // 释放内存// 错误地尝试使用已经被释放的内存
*ptr2 = 10; // 这里访问了已经被释放的内存

solution:
 使用智能指针或者使用std::move转移所有权

6 竞争条件:多个线程同时访问和修改动态分配的内存,可能导致数据不一致或者意外的行为。

#include <iostream>
#include <thread>int x = 0;void incrementX() {for (int i = 0; i < 1000000; ++i) {x++; // 读取x的值,加一,然后写回x}
}int main() {std::thread t1(incrementX);std::thread t2(incrementX);t1.join();t2.join();std::cout << "The value of x is: " << x << std::endl;return 0;
}

solution:
 使用锁啊std::mutex
 

7 内存破坏:多个线程同时访问和修改同一块内存,可能导致内存破坏和数据损坏。
 

#include <iostream>int main() {int* ptr = new int(5); // 分配了一个int类型的内存int* invalidPtr = ptr + 1; // 错误地访问了ptr指针之后的内存*invalidPtr = 10; // 错误地修改了无效指针指向的内存delete ptr; // 释放内存return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPG项目01_场景及人物动画管理器

基于“RPG项目01_UI登录”&#xff0c;新建一个文件夹名为Model&#xff08;模型&#xff09; 将资源场景拖拽至Model中 找到相应场景双击进入 红色报错部分Clear清掉即可&#xff0c;我们可以重做 接下来另存场景 起名为Game 点击保存 场景就保存至Scene中了 在文件夹下新创建…

探究Kafka原理-4.API使用

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

MySQL索引:优化数据访问的双面剑

MySQL索引&#xff1a;优化数据访问的双面剑 在数据库管理系统中&#xff0c;索引是一种关键技术&#xff0c;用于加速数据的检索过程。在MySQL这样的关系型数据库中&#xff0c;索引的使用更是不可或缺。本文将深入探讨MySQL中索引的优点和缺点&#xff0c;帮助您更全面地理解…

Vue+Ant Design 实现 tags标签选中高亮,跳转路由,删除最后一个路由跳转至前一个,删除非最后一个路由跳转至后一个

注意点&#xff1a; 1.要完成高亮效果在<a-tag>组件上 加上 :color"t.isChecked? #2db7f5:#87d068",当选中标签的时候给所以标签添加一个 isChecked属性&#xff0c;默认为false&#xff0c;选中时在更为true 2.添加isChecked属性时&#xff0c;要用this.$set…

[读论文]meshGPT

概述 任务&#xff1a;无条件生成mesh &#xff08;无颜色&#xff09;数据集&#xff1a;shapenet v2方法&#xff1a;先trian一个auto encoder&#xff0c;用来获得code book&#xff1b;然后trian一个自回归的transformermesh表达&#xff1a;face序列。face按规定的顺序&a…

SAP_ABAP_编程基础_列表_自定义列表 / 多页列表 / 列表页面设置

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读494次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

WebSocket 前端使用vue3+ts+elementplus 实现连接

1.配置连接 websocket.ts文件如下 import { ElMessage } from "element-plus";interface WebSocketProps {url: string; // websocket地址heartTime?: number; // 心跳时间间隔&#xff0c;默认为 50000 msheartMsg?: string; // 心跳信息&#xff0c;默认为pingr…

TCP 重传、滑动窗口、流量控制、拥塞控制

1&#xff1a;重传机制 超时重传 快速重传 SACK 方法 Duplicate SACK 1&#xff1a;重传机制 超时重传&#xff1a;重传机制的其中一个方式&#xff0c;就是在发送数据时&#xff0c;设定一个定时器&#xff0c;当超过指定的时间后&#xff0c;没有收到对方的ACK确认应答报文…

java:springboot3集成swagger(springdoc-openapi-starter-webmvc-ui)

背景 网上集成 swagger 很多都是 Springfox 那个版本的&#xff0c;但是那个版本已经不更新了&#xff0c;springboot3 集成会报错 Typejavax.servlet.http.HttpServletRequest not present&#xff0c;我尝试了很多才知道现在用 Springdoc 了&#xff0c;今天我们来入门一下 …

欧拉函数求与N互质的数总个数

欧拉函数的定义 1∼N1∼N 中与 NN 互质的数的个数被称为欧拉函数&#xff0c;记为 ϕ(N)ϕ(N)。 若在算数基本定理中&#xff0c;Npa11pa22…pammNp1a1p2a2…pmam&#xff0c;则&#xff1a; ϕ(N)ϕ(N) Np1−1p1p2−1p2…pm−1pm 代码&#xff1a; #include<iostream>…

OCR原理解析

目录 1.概述 2.应用场景 3.发展历史 4.基于传统算法的OCR技术原理 4.1 图像预处理 4.1.1 灰度化 4.1.2 二值化 4.1.3 去噪 4.1.4 倾斜检测与校正 4.1.4.2 轮廓矫正 4.1.5 透视矫正 4.2 版面分析 4.2.1 连通域检测文本 4.2.2 MSER检测文本 4.3 字符切割 4.3.1 连…

TiDB 在咪咕云原生场景下的实践

导读 咪咕是中国移动旗下的视频科技公司&#xff0c;门户系统是其核心业务之一。 为满足用户的多样化需求&#xff0c;咪咕计划对其数据库进行升级。 经过对中国主流国产数据库的测试评估后&#xff0c;咪咕选择了 TiDB&#xff0c;并成功将其落地于门户系统云化项目。 TiDB 为…

Linux系统之centos7编译安装Python 3.8

前言 CentOS (Community Enterprise Operating System) 是一种基于 Red Hat Enterprise Linux (RHEL) 进行源代码再编译并免费提供给用户的 Linux 操作系统。 CentOS 7 采用了最新的技术和软件包&#xff0c;并提供了强大的功能和稳定性。它适用于各种服务器和工作站应用场景&a…

分布式架构demo

1、外层创建pom 版本管理器 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/> <!-- lookup parent from repository…

鉴源实验室 | 汽车网络安全攻击实例解析(三)

作者 | 张璇 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 引言&#xff1a;随着现代汽车技术的迅速发展&#xff0c;车辆的进入和启动方式经历了显著的演变。传统的物理钥匙逐渐被无钥匙进…

栈会溢出吗?什么时候溢出?方法区会溢出吗?

文章目录 栈会溢出吗&#xff1f;什么时候溢出&#xff1f;方法区会溢出吗&#xff1f;方法区会发生溢出。常见的场景还有&#xff1a; 今天跟大家来谈谈栈方面会不会溢出这么一个问题&#xff0c;以及方法区会不会溢出 栈会溢出吗&#xff1f;什么时候溢出&#xff1f;方法区会…

快速掌握Pyqt5的2种弹簧

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

Python函数中的操作符:/、*、...

Python函数中的操作符&#xff1a;/、*、... 1、背景2、Python新操作符&#xff1a;/与*3、Python操作符&#xff1a;*&#xff08;打包与解包&#xff09;4、Python新操作符&#xff1a;... 1、背景 在Python的一些API中&#xff0c;我们可能会见到一些这样的操作符&#xff1…

certbot—30秒部署你的HTTPS,永久免费,自动续约

在之前我已经介绍过部署反向代理的2种方式了。第一种是通过宝塔的反向代理配置然后开启HTTPS。 第二种是通过nginxproxymanager。 今天要给大家分享的是一个 certbot。 Certbot 是一个由 Lets Encrypt 开发的免费开源工具&#xff0c;用于自动化部署和管理 SSL/TLS 证书。它具有…

SpringBoot3.x + mp代码生成器(更新系列)

小伙伴们&#xff0c;有没有这样一个体验&#xff0c;每次开始写一个项目时&#xff0c;搭建项目环境&#xff0c;建entity&#xff0c;mapper&#xff0c;service&#xff0c;controller层文件的感到繁琐&#xff0c;这属实体力活呀&#xff01;然而&#xff0c;自从有了Mybat…