C++中new和delete以及一些常见问题

在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;
}

输出: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值