
我是新手,如果您说错了什么,请原谅我并给我建议。
我最近想一想就写一个项目,在此期间遇到了这样的问题:
我需要在异常访问期间强行中断程序,因此,使用exit()会导致内存泄漏吗?
什么是内存泄漏,我认为我无需多说。此外,我不是权威人士。我不是权威人士。我怕犯错。我在这里省略它。我本来想在Internet上找到答案,但在搜索Internet后没有看到答案。我必须能够给出一个更合适的答案(为此,我什至参加了,也许我无法通过我的英语,但是我找不到一个好的答案);生气时,我不得不编写代码自己进行测试(尝试),而没有太多闲话,让我们看看我用于测试的代码:
#includeint main(int argc, char* argv[]) { long long *a = new long long; for (unsigned i = 0; i < 53687091; i++) a = new long long; system("pause"); exit(1); return 0; }
关于测试代码,在这里我想做一些概述:
1.没有iostream或cstdio,因为不需要输入或输出;
2.如果直接使用long long a [],则可能会触发一些我不了解的C ++实现的内存回收机制,导致异常退出时强制回收空间;可能还有一种情况,因为typename varname []是要从系统申请连续的空间。如果内存中有很多碎片,则空间应用程序可能会直接失败;

3.对于配置不正确的计算机,请适当调整周期数,否则可能导致无法预料的情况(例如崩溃,崩溃);
4.已经应用了很多次,0.花费了5秒钟以上,这是正常现象,请耐心等待;
5.我是Linux环境中的入门C,并且我习惯于编写int main(int argc,char * argv []),您可以将其更改为所需的名称(但不在我的计算机中)通过void main()编译环境
0.请不要在任何项目中模仿此代码;
确定,代码准备就绪,测试开始:
开始之前:
我的计算机的配置也很平均,总内存为4GB,可用内存约为2. 37GB

循环完成后:
虽然可以预料,但我还是很吃惊。
此时,程序没有退出,我们需要按任意键,然后执行exit()强制退出;
所以我按Enter键,任务管理器的回复是:
完美!
如果Windows可以做到,我相信Linux不会比Windows更差,甚至更好;

这表明标准化的操作系统具有良好的内存恢复机制。进程请求的所有内存页均带有标记。当进程终止时,系统将自动释放该进程请求的内存页。 ,无论是跟踪的内存还是丢失的内存(相对于进程)。
我认为系统的反射机制不能如此脆弱,并且可以被常见问题破坏。如果某个进程未终止(例如后台进程),则可能会继续产生内存泄漏和内存碎片,但是一旦该进程终止,其请求的内存页也将被关闭。
但是,我们设计的大多数项目都有一定的运行时间。如果导致大量内存泄漏,将不可避免地导致不可预测的事情;最好的方法是跟踪每个请求的内存页面。在正确的时间结束它。说到这一点,我想起了我之前写的一段代码,它的思考是深刻的:(这是我学习线性代数时写的,它是用来验证我所做的矩阵乘法工作的。正确性)
PS:为了节省空间,我将所有不重要的代码替换为“ ...”;
#includetemplate class matrix { public: ... //重头戏来了 matrix & operator * (const matrix & mltplr) const { matrix * answer = new matrix (this->height, mltplr.length, nullptr); ... return *answer; } private: unsigned height; unsigned length; TYP_FR_MTRX* detail; };
三点:
1.如果矩阵中仅使用整数,则可以使用矩阵来满足需要。我写模板类而不是特定类的原因是随意使用浮点数和整数类型(同时可以行使模板类的书写格式)
2.似乎模板一直是C ++的一个大问题。如果您将模板类中的函数编写到其他文件,则在许多编译器下的链接中似乎有错误,因此我直接编写了这些文件;

3.供我自己使用,因此无需判断是否可以相乘;
在矩阵乘法中,返回值也是矩阵类的一个实例,因此它必须具有:两个无符号的int大小的空间,一个指针大小的空间和一个指针访问的空间;如果此时使用矩阵来接收其返回值,则在销毁它时,只有它自己的两个无符号的int大小的空间,一个指针大小的空间和一个指针可以访问的空间(即,我们的新产品)。
其中,答案创建的两个无符号的int大小的空间中,指针大小的空间尚未销毁,这非常小,但是不应忽略。
我当时使用的方法是矩阵* p =&(a * b);其中a和b是与* p相同类型名称的两个实例;这样,我们删除p并可以在operator *(中构造的实例)中找到它是完全解构的; (测试方法:在构造函数中打印一行“ construct”,在析构函数中打印一行“ destruct”)
现在想想,当时真的很愚蠢

实际上,我们可以通过重载'='符号来完美地完成此内存恢复机制:
matrix& operator = (matrix const& rghnd) { const unsigned sz_mtrx = rghnd.length * rghnd.height; if (this->detail != nullptr) delete[] this->detail; if (rghnd.length != 0 && rghnd.height != 0 && rghnd.detail != nullptr) { this->height = rghnd.height; this->length = rghnd.length; this->detail = new TYP_FR_MTRX[sz_mtrx]; for (register unsigned i = 0u; i < sz_mtrx; i++) this->detail[i] = rghnd.detail[i]; } else { this->height = this->length = 0; this->detail = nullptr; } return *this; }
这样,当使用函数返回值时,无需担心其部分实例被破坏,让我们指向一段非法内存,这也避免了两个指向同一空间的矩阵可以用一颗石头杀死两只鸟。
编写项目时,可以以类似的方式使用它,尝试确保可以访问每个应用的内存空间,即使由于各种原因不能完全保证它,我们也需要减少内存泄漏和内存碎片化问题。到最低。出于这个原因,我想每个人都知道,没有用户喜欢一次单击即可崩溃的程序。
注意:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-318376-1.html
以前美国绝对不会答应