在C中我们用malloc和free。
C++的new和delete:
使用new/delete操作符
int *p = new int;
delete p;
内存分配同时初始化
int* p = new int(10);
动态内存分配数组
int* arr = new int[4]{1,2,3,4};
delete[] arr;
内存分配失败,抛出bad_alloc异常
new: new int; new Stash; //Stash是自己定义的一个类 new int[10]; delete: //先析构,然后再收回空间 delete p; delete[] p;
我们有下面这样的代码:
int *p = new int;
int *a = new int[10];
Student *q = new Student;
Student *r = new Student[10];
在分配这些空间的时候,会有一张内部的data table来记录这些东西,像下面这样,记录了new的东西的收地址和这块空间的大小。
然后如果我们来delete这些new的对象。
首先系统会在这个table中查找要delete的东西。
如果我们让a++,这个时候再delete它就会找不到。
如果我们要delete r[]缺写delete r,这个时候就只会调用student的析构一次,但是空间是全部收回了。因为回收空间这个事情是和data table有关。
我们来试试这件事情:
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A(){ cout << "A::A()" << endl; }
~A(){ cout << "A::~A(),i=" << i << endl; }
public:
int i;
void set(int i){ this->i = i; }
};
int main()
{
A* p= new A[10];
for( int i=0; i<10; i++)
{
p[i].set(i);
}
delete p;
return 0;
}
再来试试delete[] p:
一下代码为new、delete的练习:
int main()
{
int *p = (int*)malloc(sizeof(int));
free(p);
int *p1 = new int;
*p1 = 2;
cout << *p1 << endl;
delete p1;
int *p2 = new int(10); //使用()对其初始化
cout << *p2 << endl;
delete p2;
int *p3 = new int[4];
for(int i=0;i<4;i++)
{
cin >> p3[i];
cout << p3[i] << " " << endl;
}
delete[] p3;
return 0;
}