【安装配置】安装适用于 Linux 的 Windows 子系统 WSL ,完成 Clion 中对内存泄漏检测工具 Valgrind 的配置,亲测可用
1. 了解 WSL 是什么,怎么安装和使用,开了眼界;安装很方便,使用就是 Linux;2. 初步学会 Valgrind 工具的使用,配置并实地运行和检测;3. 顺便补了下 C++ 中关于 delete、delete[] 以及内存泄漏的知识,印象中面试也问到过一次;
关键词:[Linux] [WSL] [Clion] [Valfrind]
一、前言
今天在回答一个粉丝的评论(关于C++ delete 和 delete[ ])时,引出上面的系列问题,具体流程如下:
- 对于 new 出的对象数组/基本数据类型数组/string,使用 delete 和 delete[ ] 有何区别?
- 在用 Clion 跑 C++ 程序测试时发现,对于对象数组的 delete 很容易测试,同时 Clion 也会给出提示,但是对于基本数据类型数组和String的 delete 不好测试(虽然 Clion 也提示了,但没有实验结果证明);
- new 出来的数组如果没有得到很好的释放,必然引起内存泄漏,只要找到一款检测 cpp 内存泄漏的工具即可得到验证;
- 有几种检测内存泄漏的方式,但对于环境或者环境都有限制:① Visual Studio 中搭配 CRT 库检测内存泄漏(官方链接);② Valgrind,在 Linux 和 MacOS 系统中下载就能用(链接),但是 Windows 系统得通过 WSL;
- 开始找 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;
}
运行
说明:
- 第 ① 处,一共分配了20字节;
- 第 ② 处,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),但是这么做不好,不对应;
五、总结
讲了几个内容:
- 了解 WSL 是什么,怎么安装和使用,开了眼界;安装很方便,使用就是 Linux;
- 初步学会 Valgrind 工具的使用,配置并实地运行和检测;
- 顺便补了下 C++ 中关于 delete、delete[] 以及内存泄漏的知识,印象中面试也问到过一次;
that’s all!
参考文章:
- https://www.jetbrains.com/help/clion/how-to-use-wsl-development-environment-in-product.html#a4819047
- https://blog.csdn.net/qq_27093097/article/details/125209975
- https://blog.csdn.net/weiwei9363/article/details/107834706
更多推荐
所有评论(0)