C++内存泄漏检查工具——Valgrind(--tool = memcheck)

在写c++程序中通常遇到程序崩溃,我们首先想到的是内存问题

如果代码量少看几遍就能看得出来,如果代码量多起来我们就得借助一些工具了比如gdb调试和valgrind中得memcheck来解决内存问题

我用的ubuntu,先安装valgrind

sudo apt  update

sudo apt install valgrind

valgrind --version

常见的内存问题 

  • 悬空指针的读写
  • 动态内存越界访问
  • 内存泄漏
  • double delete
  • 不匹配的使用 new/delete  和malloc/free
  • 访问野指针

悬空指针的读写

#inlude<iostream>
using namespace std;
int main()
{int* p=new int(10);delete p;int a=*p;cout<<a<<endl;
}

invalid read of size 4 显示我们代码7行在无效的读取4个字节的数据(int)

all heap blocks were free  显示堆内存没有内存泄漏

动态数组越界读写

#include<iostream>
using namespace std;
int main()
{int* a=new int[5];for(int i=0;i<=5;i++)  a[i]=i;for(int i=0;i<=5;i++)  cout<<a[i]<<endl;return 0;
}

特别的静态数组越界能通过gdb调试发现,但valgrind无能为力

内存泄漏

#include<iostream>
using namespace std;
int main()
{int *a=new int(10);return 0;
}

这里我们添加参数 --leak-check=full来看详细信息

出现两次 allocs 是因为程序中不仅有你显式分配的动态内存(new int(10)),还可能有额外的内存分配来自程序运行时的环境或库的初始化

其显示在第5行operate new出来的内存块丢失发生了内存泄漏

 double delete

#include<iostream>
using namespace std;
int main()
{int* a=new int(10);delete a;delete a;return 0;
}

显示无效free 第5行申请内存,但是6,7行都释放了内存,如果是多线程情况下可能会使释放内存后,内存新数据的错误释放,造成数据安全问题,所以我们要避免double delete

 不匹配的使用 new/delete  和malloc/free

#include<iostream>
using namespace std;
int main()
{int* a=new int(10);free(a);return 0;
}

会显示类型匹配问题

malloc和new的区别在于new在申请空间的同时会调用构造函数,并且new失败会抛出异常而malloc返回nullptr

delete 不仅会释放内存还会调用析构函数

当我们使用class时,就无法正常生成对象和析构对象

访问野指针 

#include<iostream>
using namespace std;
int mian()
{int* p;int a=*p;
}

 

显示使用未初始化的指针 

 静态数组越界问题我们通过gdb调试可以调试出来,会显示栈溢出

总结

  • 内存泄漏检测:能够跟踪动态内存分配,确保分配的内存在不再需要时被正确释放。
  • 越界访问检测:帮助识别动态数组越界、空指针解引用等错误。
  • 未初始化变量检测:检测使用未初始化变量的情况。
  • 典型应用场景:当程序涉及大量的动态内存分配,或频繁出现无效内存访问、内存泄漏等问题时,用 Valgrind 非常有效。

借鉴于C++内存泄漏检查工具——Valgrind(--tool = memcheck) - unique_ptr - 博客园

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

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

相关文章

原生 JavaScript基本内容和常用特性详解

原生 JavaScript&#xff08;也称为 Vanilla JS&#xff09;指的是不依赖于任何框架或库的纯 JavaScript。以下是原生 JavaScript 的一些基本内容和常用特性详解。 目录 1. 数据类型 2. 变量声明 3. 控制结构 4. 函数 5. 对象和数组 6. 事件处理 7. DOM 操作 8. Promi…

库打包工具 rollup

库打包工具 rollup 摘要 **概念&#xff1a;**rollup是一个模块化的打包工具 注&#xff1a;实际应用中&#xff0c;rollup更多是一个库打包工具 与Webpack的区别&#xff1a; 文件处理&#xff1a; rollup 更多专注于 JS 代码&#xff0c;并针对 ES Module 进行打包webpa…

基于promtail+loki+grafana搭建日志系统

文章目录 Promtail安装promtail创建配置文件创建systemd 服务文件启动promtail服务 loki下载loki服务创建config.yml文件创建systemd服务文件启动loki grafana下载grafana 本文基于promtaillokigrafanaprometheus&#xff08;可选&#xff09; 搭建一个轻量快速的日志系统&…

微服务容器化部署实践(FontConfiguration.getVersion)

文章目录 前言一、整体步骤简介二、开始实战1.准备好微服务2.将各个微服务打包为镜像第一种第二种3. 将各个打包好的镜像,通过docker-compose容器编排,运行即可总结前言 docker容器化部署微服务: 将微服务容器化部署到 Docker 容器中是一个常见的做法,可以提高应用的可移…

人工智能(AI)和机器学习(ML)技术学习流程

目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…

Python 操作数据库:读取 Clickhouse 数据存入csv文件

import pandas as pd from clickhouse_driver import Client import timeit import logging import threading from threading import Lock from queue import Queue from typing import List, Dict, Set from contextlib import contextmanager import os import time# 配置参…

SCP收容物211~215

注 &#xff1a;此文接SCP收容物201~210,本文只供开玩笑 ,与steve_gqq_MC合作 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-211 scp-212 scp-213 scp-214 scp-215 s…

带你读懂什么是AI Agent智能体

一、智能体的定义与特性 定义&#xff1a;智能体是一个使用大语言模型&#xff08;LLM&#xff09;来决定应用程序控制流的系统。然而&#xff0c;智能体的定义并不唯一&#xff0c;不同人有不同的看法。Langchain的创始人Harrison Chase从技术角度给出了定义&#xff0c;但更…

docker-compose在阿里云服务器上部署https所踩的各种坑(已成功部署)

前言 购买服务器&#xff0c;申请域名&#xff0c;申请证书&#xff0c;下载nginx证书&#xff0c;这些操作我就不说了&#xff0c;百度一大把&#xff0c;我只说一下部署中碰到的问题 问题 我们是docker-compose上部署的后台前台环境&#xff0c;配置https证书&#xff0c;…

Qt_day3_信号槽

目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看&#xff0c;不能交互&#xff0c;信号槽可以让界面进行人机…

lua入门教程:math

在Lua中&#xff0c;math库是一个非常重要的内置库&#xff0c;它提供了许多用于数学计算的函数。这些函数可以处理各种数学运算&#xff0c;包括基本的算术运算、三角函数、对数函数、随机数生成等。结合你之前提到的Lua中的数字遵循IEEE 754双精度浮点标准&#xff0c;我们可…

UI架构解说

UI&#xff08;用户界面&#xff0c;User Interface&#xff09; 是指用户与软件或硬件系统进行交互的界面。 它是用户与系统之间的桥梁&#xff0c;允许用户通过视觉元素、交互组件和反馈机制来操作和控制应用程序或设备。 UI 设计的目标是提供直观、易用和愉悦的用户体验&a…

《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明

参考 《element plus 使用 icon 图标(两种方式)》使用 icon 升级 Vue2 升级 Vue3 项目时&#xff0c;遇到命名时的实心与空心点差异&#xff01; ElementUI&#xff1a; 实心是 el-icon-more空心是 el-icon-more-outline ElementPlus&#xff1a; 实心是 el-icon-more-fill…

RWKV 通过几万 token 的 CoT 解决几乎 100% 的数独问题(采用 29M 参数的小模型)

RWKV 做 CoT 特别有优势&#xff0c;因为推理速度和显存占用与上下文无关。即使做几百万 token 的 CoT 也不会变慢或额外消耗显存。 RWKV 社区开发者 Jellyfish042 训练了一个用于解决数独谜题的专用 RWKV 模型 Sudoku-RWKV &#xff0c;项目的训练代码和数据制作脚本均已开源…

上海市计算机学会竞赛平台2024年11月月赛丙组

题目描述 在一个棋盘上&#xff0c;有两颗棋子&#xff0c;一颗棋子在第 aa 行第 bb 列&#xff0c;另一个颗棋子在第 xx 行第 yy 列。 每一步&#xff0c;可以选择一个棋子沿行方向移动一个单位&#xff0c;或沿列方向移动一个单位&#xff0c;或同时沿行方向及列方向各移动…

【异质图学习】异构图神经网络中的自监督学习:基于语义强度和特征相似度的对比学习

【异质图学习】异构图神经网络中的自监督学习&#xff1a;基于语义强度和特征相似度的对比学习 简介&#xff1a;本文探讨了异构图神经网络中自监督学习的应用&#xff0c;特别是基于语义强度和特征相似度的对比学习技术。通过对比学习&#xff0c;模型能够从无标签数据中学习…

postgres+timescaledb--离线安装,centos7.9

操作系统是centos7.9&#xff0c;使用的hper-V,安装的虚拟机环境&#xff0c;安装好操作系统之后&#xff0c;让系统不连外网后直接按下方操作安装。 方式1&#xff0c;使用压缩包&#xff0c;复杂一点。&#xff08;第一种方式暂时没有安装timescaledb&#xff09; 装备安装…

MyBatis xml 文件中 SQL 语句的小于号未转义导致报错

问题现象 在 MyBatis 的 xml 文件中添加了一个 SQL 语句 <select id"countXxx" resultType"int">select count(*) from t1 where count < 3 </select>启动 Spring Boot 应用程序后报错&#xff1a; Caused by: org.apache.ibatis.builde…

深入剖析输入URL按下回车,浏览器做了什么

DNS 查询 首先,是去寻找页面资源的位置。如果导航到https://example.com, 假设HTML页面被定位到IP地址为93.184.216.34 的服务器。如果以前没有访问过这个网站&#xff0c;就需要进行DNS查询。 浏览器向域名服务器发起DNS查询请求&#xff0c;最终得到一个IP地址。第一次请求…

Hutool-Java工具库

日期时间 1、DateUtil 获取当前时间 import cn.hutool.core.date.DateUtil;import java.util.Calendar; import java.util.Date; //当前时间字符串&#xff0c;格式&#xff1a;yyyy-MM-dd HH:mm:ssDate date DateUtil.date();Date date2 DateUtil.date(Calendar.getInstan…