目录
1.栈和堆的概念
1.1 new 运算符的使用
1.2 new 与 malloc() 的区别
1.3 代码示例(delete):释放内存
1.栈和堆的概念
栈 (Stack)
-
栈内存 是一种自动分配的内存空间。函数内部声明的变量和函数调用都在栈上操作。当一个函数结束时,栈上的变量会自动释放。
-
由于栈内存空间较小且有固定大小,栈上的内存分配和释放速度非常快。
-
栈上的变量是编译时已知大小的,因此通常只适用于存储大小已知的局部变量。
堆 (Heap)
-
堆内存 手动管理。使用
new
运算符,可以在堆上动态分配内存。它适用于需要在运行时决定大小的内存,例如动态数组或对象。 -
堆内存需要手动释放,程序员需要在合适的时机调用
delete
来释放之前new
分配的内存,以避免内存泄漏。
1.1 new
运算符的使用
new
运算符可以用于动态分配任何类型的数据:
malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。
data-type* pointer = new data-type;
对于这段代码的解释:在这里,data-type
可以是内置类型或用户自定义类型。new
运算符会返回分配的内存地址,指针会指向这块内存。
1.2 new
与 malloc()
的区别
- 构造函数:
new
会调用构造函数,而malloc()
仅分配内存,不会调用构造函数。这意味着new
在对象的动态内存分配上更安全、更方便。 - 类型安全:
new
返回的指针类型与分配的对象类型匹配,而malloc()
返回void*
指针,因此需要强制类型转换。 - 异常处理:
new
在分配失败时会抛出std::bad_alloc
异常,而不是返回NULL
。因此可以使用try...catch
语句捕获异常,而无需手动检查NULL
值。
1.3 代码示例(delete):释放内存
以下代码分配一个 double
类型的内存空间并进行分配成功检查
#include <iostream>
#include <cstdlib> // exit() 函数需要
int main() {
double* pvalue = NULL; // 将指针初始化为 NULL
pvalue = new double; // 为变量请求内存
if (!pvalue) { // 检查是否成功分配内存
std::cout << "Error: out of memory." << std::endl;
exit(1); // 退出程序
}
*pvalue = 45.67; // 使用动态分配的内存
std::cout << "Value: " << *pvalue << std::endl;
delete pvalue; // 释放动态分配的内存
pvalue = NULL; // 将指针重置为 NULL
return 0;
}