C++中的new和delete运算符(内存管理)

首先,作为一个程序员我们要学会如何管理内存,这里主要是堆内存,栈内存由系统管理,

在c中我们使用malloc和free,系统调用时使用sbrk函数

在c++中对于内存的管理,有两个运算符new和delete,先来给大家总结一下:

    1、在C++中使用 new/delete 来管理内存,new用来申请内存,delete用来释放内存。
    2、new在内存时允许对内存进行初始化。
    3、使用new创建结构对象时会自动调用构造函数,delete时会自动调用析构函数。
    总结:malloc/free与new/delete的区别?
        1、malloc/free标准库的函数,使用时还需要添加头文件,而new/delete是C++语言中的运算符。
        2、malloc返回值的是void*指针,new返回的是有类型的指针。
        3、malloc创建对象时不会调用构造函数,free时不会调用析构函数,但new/delete会自动调用构造和析构函数。
        4、使用malloc使用内存时需要自己计算字节数,而使用new的时候会自动计算。
    4、[]可以配合new和delete申请或释放数组。
        new[]与不可以与delete混用,必须使用delete[]释放。
        使用new[]/delete[]创建多少个对象就会调用多次构造和析构。
    5、new/delete与malloc/free不能混用。
    6、delete不可以重复释放,但可以释放空指针。
    7、如果使用new申请内存失败会抛出异常"std::bad_alloc"。

写一个类来在构造和析构函数中使用new和delete:

#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

struct Student
{
	char name[20];
	char sex;
	short age;
	Student(void)
	{
		cout << "我是构造函数。。。" << endl;
	}
	Student(const char* _name,char _sex,char _age)
	{
		strcpy(name,_name);
		sex = _sex;
		age = _age;
		cout << "我是构造函数。。。" << endl;
	}

	void show(void)
	{
		cout << name << " " << sex << " " << age << endl;
	}

	~Student(void)
	{
		cout << "我是析构函数。。。" << endl;
	}
};

int main()
{
	int* nump = NULL;
	delete nump;
	delete nump;

	int* p = new int[10]{0,1,2,3,4,5,6,7,8,9};
	for(int i=0; i<10; i++)	
		cout << *(p+i) << endl;
	delete[] p;

	Student* stu = new Student[10];
	delete[] stu;
}

注意:

1、在new的同时可以为对象初始化

2、每次调用new创建对象时,会调用构造函数;

3、使用delete时,会调用析构函数。

4、申请多少次就要释放多少次,

也就是如果new[],那么在delete时也一定要加上[],即delete[].

猜你喜欢

转载自blog.csdn.net/Dachao0707/article/details/81542665
今日推荐