1、new 和 delete 运算符
栈:在函数内部声明的所有变量都将占用栈内存。
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
new
和delete
是C++中的关键字,也是一种特殊的运算符。C++中如果要在堆内存中创建和销毁对象需要借助关键字new
和delete
来完成。
例如,
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass():i(0){}
MyClass(int a):i(a){}
virtual void foo(){ cout<<i<<endl;}
int i;
};
void main()
{
MyClass *p1 = new MyClass;
MyClass *p2 = new MyClass(10);
MyClass *p3 = new MyClass[20];
delete p1;
delete p2;
delete[] p3;
}
注意:
1)C++中通过new
关键字进行动态内存申请
2)C++中的动态内存分配是基于类型进行的
3)delete
关键字用于内存释放
2、new关键字与malloc函数的区别
new
关键字和 malloc
函数都可以用于动态内存分配,但它们在功能、用途和行为上有显著的区别。
#include <iostream>
#include <exception>
using namespace std;
class MyClass {
public:
int value;
MyClass() {
value = 0;
cout << "Constructor called!" << endl;
}
~MyClass() {
cout << "Destructor called!" << endl;
}
};
int main() {
// 使用 new 关键字分配内存
MyClass* obj1 = new MyClass();
obj1->value = 42;
cout << "Value using new: "
<< obj1->value << endl;
delete obj1; // 自动调用析构函数
// 使用 malloc 函数分配内存
MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass));
memset(obj2, 0, sizeof(MyClass)); // 初始化内存
obj2->value = 42;
cout << "Value using malloc: "
<< obj2->value << endl;
free(obj2); // 不调用析构函数
return 0;
}
1)new
关键字是C++的一部分,malloc
是由C库提供的函数。
2)new
以具体类型为单位进行内存分配,malloc
以字节为单位进行内存分配。
3)new
在申请单个类型变量时可进行初始化。malloc
不具备内存初始化的特性。
3、C++动态分配内存异常机制
如我们分配一个很大的内存空间,会出现栈满,程序产生异常,程序崩溃。则需要引入异常机制。C ++提供了两种标准机制来检查分配是否成功。
1)处理异常,在分配失败时抛出bad_alloc类型的异常。如果抛出此异常并且未由特定处理程序处理,则程序执行将终止。
例如,
#include <iostream>
#include <new> // for std::bad_alloc
using namespace std;
int main() {
try {
// 尝试分配一块很大的内存
// 可能超出系统可用内存
int* ptr = new int[1000000000000];
} catch (const std::bad_alloc& e) {
// 捕获异常并处理
cout << "Memory allocation failed: "
<< e.what() << endl;
}
return 0;
}
2)使用nothrow
,内存分配失败时,而不是抛出bad_alloc
异常或终止程序,new
返回的指针是空指针,程序继续正常执行 。
例如,
#include <iostream>
#include <new> // for std::nothrow
using namespace std;
int main() {
// 使用 nothrow 分配内存
// 可能超出系统可用内存
int* ptr = new(std::nothrow) int[1000000000000];
if (ptr == nullptr) {
// 检查指针是否为空
cout << "Memory allocation failed!" << endl;
} else {
cout << "Memory allocation succeeded!" << endl;
delete[] ptr; // 释放内存
}
return 0;
}