【安装配置】安装适用于 Linux 的 Windows 子系统 WSL ,完成 Clion 中对内存泄漏检测工具 Valgrind 的配置,亲测可用

12 篇文章 0 订阅
4 篇文章 0 订阅

关键词:[Linux] [WSL] [Clion] [Valfrind] 在这里插入图片描述

一、前言

今天在回答一个粉丝的评论(关于C++ delete 和 delete[ ])时,引出上面的系列问题,具体流程如下:

  1. 对于 new 出的对象数组/基本数据类型数组/string,使用 delete 和 delete[ ] 有何区别?
  2. 在用 Clion 跑 C++ 程序测试时发现,对于对象数组的 delete 很容易测试,同时 Clion 也会给出提示,但是对于基本数据类型数组和String的 delete 不好测试(虽然 Clion 也提示了,但没有实验结果证明);
  3. new 出来的数组如果没有得到很好的释放,必然引起内存泄漏,只要找到一款检测 cpp 内存泄漏的工具即可得到验证;
  4. 有几种检测内存泄漏的方式,但对于环境或者环境都有限制:① Visual Studio 中搭配 CRT 库检测内存泄漏(官方链接);② Valgrind,在 Linux 和 MacOS 系统中下载就能用(链接),但是 Windows 系统得通过 WSL;
  5. 开始找 Clion 通过 WSL 使用 Valgrind 进行内存泄漏检测 的解决方案,解决报错以及解答相关问题;

二、WSL 是什么

在这里插入图片描述
WSL有什么用?
Windows Subsystem for Linux(简称WSL)适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序;简单来说,不用双系统和虚拟机就能在 Windows 中使用 linux 系统

WSL 的优势
不会产生传统虚拟机或双启动设置开销;而且 Clion 中直接支持;

长见识了

三、安装 WSL 并配置 valgrind 相关内容

3.1 CMD 命令安装并重启

现在,可以在管理员 PowerShell 或 Windows 命令提示符中输入命令wsl --install;此命令将启用运行 WSL 并安装 Linux 的 Ubuntu 发行版所需的功能;
在这里插入图片描述
然后重启计算机来安装运行适用于 Linux 的 Windows 子系统 (WSL) 所需的全部内容。

如果要更改默认安装的发行版本(链接

关掉后找不到进入 Linux 的入口,咋整?它其实就是 Store 里面的一个应用,直接应用里找就行;
在这里插入图片描述

3.2 设置用户名密码

重启后会自动启动 Linux,然后就等待将 Linux 系统相关文件解压缩并存储到计算机上;(这里要等好一会,十几分钟)

然后让你设置用户名和密码;
在这里插入图片描述

3.3 Clion 工具链 Toolchains 配置

Toolchains 里面新建 WSL,然后除了 红框 外的信息 Clion 都会自动填充
红框部分就是我们要在 Linux 里面安装的内容,其实就是 linux 也弄一个 运行C++ 程序的环境;
在这里插入图片描述
下面就 一边安装 C++ 环境 一边用 Clion 检测是否成功;

3.4 安装 C++ 相关程序和 valgrind

命令1:sudo apt-get install cmake 安装 cmake;
cmake 安装后,相当于你的 cmake、gcc、gdb 都安装了;
不放心可以用命令检测,比如 gcc sudo apt-get install gcc
如果出现下图,很明显已经安装了 gcc;
在这里插入图片描述
命令2:sudo apt-get install build-essential 安装 build-essential;

命令3:sudo apt-get install clang 安装 clang;

命令4:sudo apt-get install valgrind 安装 valgrind;

注意:如果出现这个错误 E: Unable to locate package clang,那么首先检查 package 包名是否写错,如果没错,请毫不犹豫 命令sudo apt-get update 升级 apt;然后再执行之前失败的命令;(其他的解决方案我也试了,不管用,升级 apt 管用)

3.5 补充 Clion 中 Valgrind executable 路径

经过 2.4 后,Clion 起码能够自动检测到 WSL,看看是不是跟我一样
在这里插入图片描述
红框都能显示对勾和检测到就没问题,蓝框不用管;

然后进入 valgrind 路径设置
在这里插入图片描述
\\wsl$\Ubuntu\usr\bin\valgrind 这个基本不用变,如果你进去没有自动填充就手打吧,valgrind 默认就是安装在这里面;

3.6 解决 CreateProcess error=193 报错

这时候 按道理你可以直接将 Clion 里面的 cpp程序 送到 linux 中执行,怎么操作?点这个按钮就行;
在这里插入图片描述

但这时候 我报了个错:
Error running 'C__Clion': Cannot run program "\\wsl$\Ubuntu\usr\bin\valgrind.bin" (in directory "E:\Desktop\Programmer\C++Clion\cmake-build-debug"): CreateProcess error=193, %1 不是有效的 Win32 应用程序。

当时也是一脸蒙蔽,无意间在官网中找到解决方案:
在这里插入图片描述
点进去,发现的确省略了一个步骤:
在这里插入图片描述
我们需要将 Toolchains 中的 WSL 移到最前面(即设为默认);
在这里插入图片描述
然后这个问题得到解决,又出现新的问题

3.7 解决 CMake 版本不匹配问题

点击 Run with Valgrind Memcheck 运行发现报错
在这里插入图片描述
原因是我们 Linux 中的 CMake 版本与 Project 里面的 CMakeLists.txt 设置的版本不同,这里我设置的 3.21,而 Linux 里面的 CMake 版本时 3.16.3;
在这里插入图片描述
所以解决办法也很容易,直接修改 CMakeLists.txt 中的版本号即可;
在这里插入图片描述
至此,WSL 安装 和 Clion 中配置 Valgrind 所有流程结束;

四、测试 Valgrind

4.1 发生内存泄漏

这是个会导致内存泄漏的程序,没毛病(第5行 需要 delete[] p 才能有效释放内存)

// cbase.h
class cbase {
public:

    cbase();

    ~cbase();

private:
    int cdata;
};
// main.cpp
void funcObject2(const int num) {
    cout << "===== start ====" << endl;
    cbase *p = new cbase[num];
    cout << "===== delete p: ====" << endl;
    delete p;
    cout << "===== end ====" << endl;
}

运行
在这里插入图片描述
说明:

  1. 第 ① 处,一共分配了20字节;
  2. 第 ② 处,20 字节一定发生了内存泄漏,原因推测是这样:cbase 类一个对象是4个字节(只有一个 int 成员变量),完整 new 出对象数组时,内存占用20字节,即 4*3+8=20,8个字节是用于存放数组长度(不同系统可能不一样,有的是4),放在数组的最前面;当我释放了数组的第一个元素后,此时 |8(未释放)|4(已释放)|4(未释放)|4(未释放)|,虽然中间的 4 个字节得到释放,但对于整个连续的 20 字节的块来说,没有释放,因此还是泄漏了 20 字节;这一点在另一篇文章中可能看的更清晰:

4.2 未发生内存泄漏

如果没发生内存泄漏,分两种情况:

情况一:下面例子有效释放内存,不会导致内存泄漏

void funcObject1(const int num) {
    cout << "===== start ====" << endl;
    cbase *p = new cbase[num];
    cout << "===== delete p: ====" << endl;
    delete[] p;
    cout << "===== end ====" << endl;
}

在这里插入图片描述
此时,点开 valgrind ,啥都不会显示,一切正常;

情况二:没有泄漏,但提示 new[] 和 delete 不匹配
对于基本数据类型数据,delete 和 delete[ ] 都可以,但是推荐用后者,这里我就用 delete;

void funcChar2(const int num) {
    cout << "===== start ====" << endl;
    char *p = new char[num];
    cout << "===== delete p: ====" << endl;
    delete p;
    cout << "===== end ====" << endl;
}

结果如下:
在这里插入图片描述
第 ① 处:基本数据类型没有析构函数,所以 new 和 delete 都不会干啥,但是看第 ② 处: Valgrind,提示 MismatchedFree ,不匹配的释放是什么意思?就是你这个虽然不会导致内存泄漏(泄漏了 0 bytes),但是这么做不好,不对应;

五、总结

讲了几个内容:

  1. 了解 WSL 是什么,怎么安装和使用,开了眼界;安装很方便,使用就是 Linux;
  2. 初步学会 Valgrind 工具的使用,配置并实地运行和检测;
  3. 顺便补了下 C++ 中关于 delete、delete[] 以及内存泄漏的知识,印象中面试也问到过一次;

that’s all!

参考文章:

  1. https://www.jetbrains.com/help/clion/how-to-use-wsl-development-environment-in-product.html#a4819047
  2. https://blog.csdn.net/qq_27093097/article/details/125209975
  3. https://blog.csdn.net/weiwei9363/article/details/107834706
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值