在C++中使用内存分配和释放主要涉及到两个操作符:new
和delete
,以及两个函数:malloc()
和free()
。其中,new
和delete
比malloc()
和free()
更常用。
使用new操作符分配内存
new
操作符可以用于在堆上分配内存,并返回一个指向所分配内存的指针。它的语法如下:
int *p = new int;
以上语句分配了一个整型变量的内存,并将其地址赋值给指针变量p
。我们也可以在分配内存时进行初始化,例如:
int *p = new int(42);
以上语句分配了一个整型变量的内存,并将其初始化为42
,然后将其地址赋值给指针变量p
。
使用new
时,需要注意以下几点:
- 内存分配成功后,需要手动释放对应的内存,否则会导致内存泄漏。
- 分配的内存可使用指针访问,但无法使用变量名直接访问。
- 若在分配内存时出现错误,会抛出
std::bad_alloc
异常,需要进行异常处理。
下面是一个new
操作符的示例:
#include <iostream>
using namespace std;
int main() {
int *p = nullptr; // 初始化指针为nullptr
try {
p = new int(10); // 分配一个整型变量的内存,并将其初始化为10
} catch (const std::bad_alloc &e) { // 异常处理
cerr << "Memory allocation failed: " << e.what() << endl;
return 1;
}
cout << "The value of p is: " << *p << endl;
delete p; // 释放内存
return 0;
}
上述示例使用了delete
操作符来释放内存。
使用malloc函数分配内存
malloc()
函数是C语言中用于动态分配内存的函数,主要用于在堆上动态分配内存。它的语法如下:
int *p = (int *)malloc(sizeof(int));
以上语句分配了一个整型变量的内存,并将其地址赋值给指针变量p
。使用malloc()
分配内存时,需要注意以下几点:
- 返回值为
void*
类型,需要进行强制类型转换。 - 内存分配成功后,需要手动释放对应的内存,否则会导致内存泄漏。
- 分配的内存可使用指针访问,但无法使用变量名直接访问。
- 若在分配内存时出现错误,会返回
nullptr
。
下面是一个malloc()
函数的示例:
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int *p = static_cast<int *>(malloc(sizeof(int))); // 强制类型转换
if (p == nullptr) { // 错误处理
cerr << "Memory allocation failed." << endl;
return 1;
}
*p = 10; // 对分配的内存赋值
cout << "The value of p is: " << *p << endl;
free(p); // 释放内存
return 0;
}
上述示例使用了free()
函数来释放内存。
注意事项
需要注意的是,new
和malloc()
在某些情况下不能互相替代。例如,使用new
分配一个类对象的内存时,除了分配内存外还需要调用构造函数,而malloc()
则不能实现这一功能。另外,RAII机制使用new
、delete
操作符实现了资源管理,使用malloc()
和free()
时需要手动管理内存,若不小心出现内存泄漏等问题,会导致程序出现严重错误。
使用delete操作符释放内存
在使用new
操作符动态分配内存后,需要使用delete
操作符来释放所分配的内存。它的语法如下:
delete p;
其中,p
是一个指向所分配内存的指针。需要注意以下几点:
- 使用
delete
时,只能用于释放使用new
所分配的内存,不能释放使用malloc()
等函数所分配的内存。 - 使用
delete
时,需要使用与new
相应的析构函数来销毁对象。 - 在释放内存后,需要将指针变量设为
nullptr
,以避免悬空指针带来的问题。
下面是一个delete
操作符的示例:
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass(int n) : num(n) {}
~MyClass() { cout << "MyClass destructor." << endl; }
private:
int num;
};
int main() {
MyClass *p = new MyClass(10);
delete p;
p = nullptr;
return 0;
}
上述示例中,定义了一个类MyClass
,使用new
操作符创建了该类的对象,并使用delete
操作符释放了所分配的内存。在类中重写了析构函数,以便在对象被删除时输出信息。
使用free函数释放内存
在使用malloc()
函数动态分配内存后,需要使用free()
函数来释放所分配的内存。它的语法如下:
free(p);
其中,p
是一个指向所分配内存的指针。需要注意以下几点:
- 使用
free()
时,只能用于释放使用malloc()
等函数所分配的内存,不能释放使用new
所分配的内存。 - 在释放内存后,需要将指针变量设为
nullptr
,以避免悬空指针带来的问题。
下面是一个free()
函数的示例:
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int *p = static_cast<int *>(malloc(sizeof(int)));
if (p == nullptr) {
cerr << "Memory allocation failed." << endl;
return 1;
}
*p = 10;
cout << "The value of p is: " << *p << endl;
free(p);
p = nullptr;
return 0;
}
上述示例中,使用malloc()
函数分配了一个整型变量的内存,并使用free()
函数释放了所分配的内存。在释放内存后,将指针变量设为空指针,以避免悬空指针。