new就是告诉计算机开辟一段新的空间,但是和一般的声明不同,new开辟的空间在堆(Heap)上,而一般声明的变量(函数内)在存放在栈上
new在堆区上创建一个对象的时候,它实际做了三件事:动态分配内存空间,调用构造函数,返回正确的指针.若创建的是简单类型的变量,那么第二步就会被省略
C++中的new
运算符用来在堆上动态分配内存,创建一个新的对象,它的主要作用可以总结如下:
动态内存分配:new
运算符通过调用operator new()
函数在堆上分配一块连续的内存空间,返回指向该空间的指针。
对象构造:在分配内存之后,new
关键字会自动调用相应类的构造函数,对内存空间中的对象进行构造和初始化。
灵活性:使用new
运算符,我们可以在程序执行的过程中动态地分配内存空间,改变内存使用情况,提高程序灵活性。
需要注意的是,使用new
运算符分配的内存必须由程序员负责释放,否则会出现内存泄漏等问题。通常我们使用delete
运算符来释放动态分配的内存,以避免出现内存泄漏的问题
class Person {
public:
Person() {
cout << "Person Constructor"<
class Person {
public:
Person(string name, int age)
{
cout << "Person Constructor with parameters: " << name << ", " << age << endl;
}
};
int main() {
Person* ptr = new Person("Tom", 20);
delete ptr;
return 0;
}
class Person {
public:
Person(string name) : m_name(name) {};
void getInfo()
{
cout << "Name: " << name_ << endl;
}
private:
string m_name;
};
int main()
{
Person* ptr = new Person[2] { {"Tom"}, {"Jerry"} };
ptr[0].getInfo();
ptr[1].getInfo();
delete[] ptr;
return 0;
}
class Person {
public:
void getInfo()
{
cout << "I am a person!" << endl;
}
};
int main()
{
Person* ptr = new Person;
ptr->getInfo();
delete ptr;
return 0;
}
#include
using namespace std;
int main()
{
int* ptr = new int;//new一个int类型的内存空间,并且返回空间的首地址给指针ptr
*ptr = 10;//*运算符将10赋值给这个内存空间(即*ptr)
cout << *ptr;
delete ptr;//手动释放
return 0;
}
new()分配程序员自定义的类型的一个自定大小的内存空间,并以括号中的值来初始化这个变量
#include
using namespace std;
int main()
{
int* ptr = new int(3);
//使用new运算符动态分配了一个int类型的内存空间,并将其赋值为3,
//然后返回该内存空间的地址,将该地址赋值给指针变量ptr
cout << *ptr << endl;
delete ptr;
return 0;
}
语法:
data_type *arrary_name=new data_typr[array_size];
数据类型 *指针名(指向数组的首元素的指针)=new 数组数据类型[数组长度]
#include
using namespace std;
int main()
{
int* arr = new int[10];
for(int i = 0; i < 10; i++)
{
arr[i] = i + 1;
cout << arr[i] << " ";
}
//访问数组元素,并查找最大值
int max = arr[0];
for (int i = 1; i < 10; i++)
{
if (max <= arr[i])
max = arr[i];
}
cout << "max of arr is " << max << endl;
//释放数组的内存
delete[] arr;
return 0;
}
补充:
静态 int array[100]; 定义了数组array,并未对数组进行初始化
静态 int array[100] = {1,2}; 定义并初始化了数组array
动态 int* array = new int[100]; delete []array; 分配了长度为100的数组array
动态 int* array = new int[100]{1,2}; delete []array; 为长度为100的数组array初始化前两个元素
对二维数组的理解方式很重要:把二维数组看成一个特殊的一维数组,它的元素又是一个一个的一维数组
首先,和一维数组的创建其实是一样的,假设有n个元素,那动态一维数组的创建是这样的
int* mat = new int[n];
而二维数组只是多了一步,可以理解成先创建了n个一维数组,再对这n个一维数组开辟空间。
int** mat=new int*[n];
for (int i = 0;i < n;i++)
mat[i] = new int[n];
输入
1
4
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
#include
using namespace std;
int main()
{
int k;
cin >> k;
while (k--)
{
int n;
cin >> n;
int** mat=new int*[n];
for (int i = 0;i < n;i++)
mat[i] = new int[n];
for (int i = 0;i < n;i++)
for (int j = 0;j < n;j++)
cin >> mat[i][j];
for (int i = 0;i < n;i++)
{
for (int j = 0;j < n;j++)
{
cout << mat[i][j] <<" ";
}
cout << endl;
}
}
}
释放空间:
for (int i = 0;i < n;i++)
delete[]mat[i];
delete[]mat;
补充:
静态 int array[10][10]; 定义了数组,并未初始化
静态 int array[10][10] = { {1,1} , {2,2} }; 数组初始化了array[0][0,1]及array[1][0,1]
动态 int (*array)[n] = new int[m][n]; delete []array; // in c++11: auto array = new int[m][n]
动态 int** array = new int*[m]; for(i) array[i] = new int[n]; for(i) delete []array[i]; delete []array; 多次析构
动态 int* array = new int[m*n]; delete []array; 数组按行存储
注意这种方式不可用: int **array = new int[m][n];