1)解释一下 new 和 delete 运算符在 C++ 中的作用。
new用于在堆上动态分配内存,并调用构造函数初始化对象
delete用于释放由new分配的内存,并调用析构函数清理对象
在 C++ 中,new和delete运算符主要用于动态内存管理。
一、new运算符的作用:
动态分配内存:
new在堆上分配所需的内存空间 例如,int* ptr = new int会在堆上分配足够存储一个整数的内存空间,并返回一个指向该内存地址的指针。
对于数组的分配,如int* arr = new int[10]会分配足够存储 10 个整数的连续内存空间。
调用构造函数初始化对象:
当用于对象分配时,new不仅分配内存,还会自动调用对象的构造函数来初始化对象。例如,
MyClass* obj = new MyClass()会创建一个MyClass类型的对象,并调用其构造函数进行初始化。
二、delete运算符的作用:
释放内存:
delete用于释放由new分配的单个对象的内存空间。例如,如果有int* ptr = new int,在使用完该内存后,可以使用delete ptr来释放该内存。
对于由new[]分配的数组内存,需要使用delete[]来释放。例如,int* arr = new int[10];,释放时应使用delete[] arr。
调用析构函数清理对象:
当释放对象的内存时,delete会自动调用对象的析构函数来执行必要的清理工作。析构函数通常用于释放对象在生存期内获取的资源,如文件句柄、网络连接等。
使用new和delete时需要注意以下几点:
1.确保对由new分配的内存都使用delete进行释放,以避免内存泄漏。
2.不要对同一内存地址多次使用delete,否则可能导致未定义行为。
3.对于数组的分配和释放,必须使用正确的形式(new[]和delete[])。
2)什么是内存泄漏?如何避免内存泄漏?
内存泄漏是指程序中动态分配的内存没有被正确释放,导致内存资源的浪费
避免内存泄漏的方法包括及时释放不再使用的动态内存,使用智能指针等
1.使用智能指针
C++11 引入了智能指针,如unique_ptr和shared_ptr,它们可以自动管理内存的分配和释放,大大减少了内存泄漏的风险。
示例:在这个例子中,unique_ptr和shared_ptr会在它们超出作用域时自动释放所管理的内存,确保不会发生内存泄漏。
#include <memory>
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass()
{
cout << "构造函数" << endl;
}
~MyClass()
{
cout << "析构函数" << endl;
}
};
int main()
{
//使用unique_ptr
unique_ptr<MyClass> ptr1 = make_unique<MyClass>();
//使用shared_ptr
shared_ptr<MyClass> ptr2 = make_shared<MyClass>();
return 0;
}
2.避免手动管理内存时的错误
在 C++ 中,如果使用new和delete手动管理内存,要确保在合适的时机调用delete来释放内存。避免忘记释放内存或者在错误的地方释放内存。
示例:
#include <memory>
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass()
{
cout << "构造函数" << endl;
}
~MyClass()
{
cout << "析构函数" << endl;
}
};
int main()
{
MyClass* ptr = new MyClass();
//确保在合适的地方释放内存
delete ptr;
return 0;
}