C++深入讲解new与delete关键字的使用
在C++中,我们可以通过new
关键字动态地分配内存,通过delete
关键字释放已经分配的内存。new
和delete
是C++中动态内存管理的必备工具,掌握它们的使用方法对于C++程序员来说至关重要。
本文将详细介绍new
和delete
的用法以及注意事项。
基本用法
动态分配内存
我们可以使用new
关键字从堆中动态地分配内存,如下所示:
// 分配一个int类型的内存块
int *p = new int;
这行代码会在堆上分配一个int
对象的内存块,并把它的地址赋值给指针p
。
注意,我们不需要手动计算内存块的大小,由编译器自动根据类型大小来分配内存。
初始化动态分配的内存
我们可以在使用new
分配内存时,指定初始值,如下所示:
// 分配一个int类型的内存块,并初始化为0
int *p = new int(0);
这行代码会在堆上分配一个int
对象的内存块,并把它初始化为0。
释放内存
我们可以使用delete
关键字来释放已经分配的内存,如下所示:
// 释放p指向的内存块
delete p;
这行代码会释放指针p
指向的堆内存块。注意,使用delete
时,必须确保指针指向的内存块已经被分配。如果指针指向的内存块没有被分配,或者已经被释放,那么会导致不可预知的后果。
数组的动态分配
除了动态分配单个对象外,我们还可以使用new
关键字动态分配一个数组。下面是一个例子:
// 分配一个包含10个int类型对象的数组
int *arr = new int[10];
这行代码会在堆上分配一个包含10个int
对象的数组,并把它的首地址赋值给指针arr
。
注意,与单个对象的动态分配不同,动态分配数组时必须手动指定数组大小。
对动态分配的数组进行初始化
与单个对象的动态分配一样,我们也可以在动态分配数组时进行初始化。下面是一个例子:
// 分配一个包含10个int类型对象的数组,并初始化为0
int *arr = new int[10]{0};
这行代码会在堆上分配一个包含10个int
对象的数组,并把它的首地址赋值给指针arr
。数组中的所有元素都会被初始化为0。
释放数组的内存
对于动态分配的数组,我们也可以使用delete
关键字释放其所占用的内存。如下所示:
//释放arr指向的动态分配的数组
delete [] arr;
这行代码会释放指针arr
所指向的动态分配的数组所占用的内存。注意,释放数组内存时必须使用delete[]
,而不是delete
。
总结
在C++中,new
和delete
是动态内存管理的基本工具。通过new
,我们可以从堆中动态分配内存,并进行初始化;通过delete
,我们可以释放已经分配的内存。对于数组的动态分配,我们也可以使用new[]
和delete[]
来进行操作。
在使用new
和delete
的过程中,需要注意避免内存泄漏和非法访问等问题,以保证程序的正确执行。
示例1:
// ClassA.h
#include <iostream>
class ClassA{
private:
int* nums;
int size;
public:
ClassA(int size){
nums = new int[size];
this->size = size;
}
void show(){
for(int i=0;i<size;++i){
std::cout<<nums[i]<<" ";
}
std::cout<<std::endl;
}
~ClassA(){
delete [] nums;
std::cout<<"~ClassA"<<std::endl;
}
};
#include "ClassA.h"
int main(){
ClassA* obj = new ClassA(5);
obj->show();
delete obj;
return 0;
}
输出:
0 0 0 0 0
~ClassA
示例2:
// ClassB.h
#include <iostream>
class ClassB{
private:
int* nums;
int size;
public:
ClassB(int size){
nums = new int[size]{1,2,3,4,5};
this->size = size;
}
void show(){
for(int i=0;i<size;++i){
std::cout<<nums[i]<<" ";
}
std::cout<<std::endl;
}
~ClassB(){
delete [] nums;
std::cout<<"~ClassB"<<std::endl;
}
};
#include "ClassB.h"
int main(){
ClassB* obj = new ClassB(5);
obj->show();
delete obj;
return 0;
}
输出:
1 2 3 4 5
~ClassB
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++深入讲解new与deleted关键字的使用 - Python技术站