今天在回答一个粉丝的评论;关于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有什么用?
Windows Subsystem for Linux;简称WSL;适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序;简单来说;不用双系统和虚拟机就能在 Windows 中使用 linux 系统;
WSL 的优势
不会产生传统虚拟机或双启动设置开销;而且 Clion 中直接支持;
长见识了
现在;可以在管理员 PowerShell 或 Windows 命令提示符中输入命令wsl --install;此命令将启用运行 WSL 并安装 Linux 的 Ubuntu 发行版所需的功能;
然后重启计算机来安装运行适用于 Linux 的 Windows 子系统 (WSL) 所需的全部内容。
如果要更改默认安装的发行版本;链接;
关掉后找不到进入 Linux 的入口;咋整?它其实就是 Store 里面的一个应用;直接应用里找就行;
重启后会自动启动 Linux;然后就等待将 Linux 系统相关文件解压缩并存储到计算机上;;这里要等好一会;十几分钟;
然后让你设置用户名和密码;
Toolchains 里面新建 WSL;然后除了 红框 外的信息 Clion 都会自动填充
红框部分就是我们要在 Linux 里面安装的内容;其实就是 linux 也弄一个 运行C;; 程序的环境;
下面就 一边安装 C;; 环境 一边用 Clion 检测是否成功;
命令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 管用;
经过 2.4 后;Clion 起码能够自动检测到 WSL;看看是不是跟我一样
红框都能显示对勾和检测到就没问题;蓝框不用管;
然后进入 valgrind 路径设置
wsl$Ubuntuusrinvalgrind 这个基本不用变;如果你进去没有自动填充就手打吧;valgrind 默认就是安装在这里面;
这时候 按道理你可以直接将 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 移到最前面;即设为默认;;
然后这个问题得到解决;又出现新的问题
点击 Run with Valgrind Memcheck 运行发现报错
原因是我们 Linux 中的 CMake 版本与 Project 里面的 CMakeLists.txt 设置的版本不同;这里我设置的 3.21;而 Linux 里面的 CMake 版本时 3.16.3;
所以解决办法也很容易;直接修改 CMakeLists.txt 中的版本号即可;
至此;WSL 安装 和 Clion 中配置 Valgrind 所有流程结束;
这是个会导致内存泄漏的程序;没毛病;第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;
}
运行
说明;
如果没发生内存泄漏;分两种情况;
情况一;下面例子有效释放内存;不会导致内存泄漏
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;