快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → 安装适用于-Linux-的-Windows-子系统-WSL-,完成-Clion-中对内存泄漏检测工具-Valgrind-的配置,亲测可用

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

时间:2022-10-09 11:24:26人气:作者:快盘下载我要评论

一、前言

今天在回答一个粉丝的评论;关于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 是什么

安装适用于-Linux-的-Windows-子系统-WSL-,完成-Clion-中对内存泄漏检测工具-Valgrind-的配置,亲测可用
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 系统相关文件解压缩并存储到计算机上;;这里要等好一会;十几分钟;

然后让你设置用户名和密码;
Clion

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 路径设置
Valgrind
wsl$Ubuntuusrinvalgrind 这个基本不用变;如果你进去没有自动填充就手打吧;valgrind 默认就是安装在这里面;

3.6 解决 CreateProcess error=193 报错

这时候 按道理你可以直接将 Clion 里面的 cpp程序 送到 linux 中执行;怎么操作?点这个按钮就行;
中对内存泄漏检测工具

但这时候 我报了个错;
Error running ;C__Clion;: Cannot run program ;wsl$Ubuntuusrinvalgrind.bin; (in directory ;E:DesktopProgrammerC;;Clioncmake-build-debug;): CreateProcess error=193, %1 不是有效的 Win32 应用程序。

当时也是一脸蒙蔽;无意间在官网中找到解决方案;
中对内存泄漏检测工具
点进去;发现的确省略了一个步骤;
,完成
我们需要将 Toolchains 中的 WSL 移到最前面;即设为默认;;
的配置,亲测可用
然后这个问题得到解决;又出现新的问题

3.7 解决 CMake 版本不匹配问题

点击 Run with Valgrind Memcheck 运行发现报错
Valgrind
原因是我们 Linux 中的 CMake 版本与 Project 里面的 CMakeLists.txt 设置的版本不同;这里我设置的 3.21;而 Linux 里面的 CMake 版本时 3.16.3;
WSL
所以解决办法也很容易;直接修改 CMakeLists.txt 中的版本号即可;
WSL
至此;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;
}

运行
Clion
说明;

第 ① 处;一共分配了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;
}

WSL
此时;点开 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#a4819047https://blog.csdn.net/QQ_27093097/article/details/125209975https://blog.csdn.net/weiwei9363/article/details/107834706

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。