看了一篇关于“C.C++内存管理”的文章,有几点疑问,求朋友帮澄清。该怎么处理

看了一篇关于“C.C++内存管理”的文章,有几点疑问,求朋友帮澄清。
文章是这样的:


疑问1. “堆”和“自由存储区”不一样吗?malloc等函数与new分配的内存不属于同一内存区域吗?
疑问2. “如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。”,这句话意味着程序员可以不是非得调用delete来释放new分配的内存也不会造成内存泄漏吗,因为程序结束后,操作系统会自动回收?

另一段文章:

疑问3. 上面话的意思好像alloca分配的内存属于栈区,对吗?
疑问4. 这里的alloca和malloc是不是同一类动态分配内存函数?后一句的意思难道是说我们无需手动用free去释放动态分配的内存???

[size=16px]各位大哥、大姐,我之前不是搞这个的,所以不了解这些细节知识,问题也许提的有点白痴,麻烦你不吝赐教,给纠正并讲解下,谢谢了。这些东西一般的书上讲不了很细:-([/size]

------解决方案--------------------
>>疑问1.
堆和自由存储区是相同的.我觉得你那篇文章描述欠妥.

"堆,就是那些由new分配的内存块","自由存储区,就是那些由malloc等分配的内存块"
===================================
应该是说new和malloc在堆(自由存储区)中分配内存块;堆指的是一份特定的内存,而不是说因为new或malloc才产生的堆


>>疑问2.
内存泄漏是发生在程序运行期间的.倘若一个程序在运行期间发生大量内存泄漏,必然会导致系统可用内存减少.严重时可能影响系统的正常运行

>>疑问3 & 4.
alloca就是用于在栈中动态分配内存,并在函数返回时自动释放内存,和malloc不同,自然也无需用free手动释放了
------解决方案--------------------
malloc and new都是在堆上分配一块内存区域
至于释放问题,有些编译器会在你没有free的时候在程序结束会自动释放
alloca ..
应该是realloc 吧,属于动态分配
至于要不要释放,那是肯定的,在程序执行结束自己free(XX);
------解决方案--------------------
alloca是在栈上分配,因此不需要释放。但是alloca不属于ANSI C标准。因此没什么特殊的情况,最好不要用。

进程结束后,系统确实会回收堆内存。但这并不表示我们的程序从此不用手动释放内存。理由如下:
1、内存是宝贵的资源,不要随意浪费。在应用程序执行的过程中,及时释放不需要的内存是好的习惯。否则内存占有量将不必要的变大。
2、有些程序是需要连续执行很久的。比如服务器上的一些程序,需要几个星期连续执行。这个时候进程一直存在,操作系统将不会回收内存。
3、资源的使用与内存的使用非常的相似,但是操作系统不会自动回收资源。当我们申请临界区,互斥体等一些核心对象资源的时候,是一定要手动释放的。操作系统不会因为进程结束而释放他们。因此需要用管理内存的手段去管理资源。
4、C++语言提供了很多手段共我们申请/释放内存和资源。有了他们,我们的内存和资源管理就变得容易。因此我们要多使用容器,智能指针等工具来管理资源和内存。我们很快能够发现,良好的资源管理的程序其实绝大多数时候并不比糟糕资源管理的程序复杂。

------解决方案--------------------
还是简单的回答楼主的疑问二:
考虑如下代码:
int *p;
while(true)
{
p=new int[100];
............. // 其它执行片段
}
一般的win32应用程序,绝大部分存在一个死循环(用来接受消息或处理不同的任务),试想在一个如此无限的循环中分配堆内存而又不delete会有什么后果。
再强调一点,操作系统收回内存的行为只会等到进程退出或程序完全结束,而大部分的程序都不会一运行就结束的。