c++内存分配与释放

new/delete 与 malloc/free 区别

相同点:
  1. 对于基本数据类型,分配和释放是一致的.
  2. 都不可以多次释放.
  3. free不改变指针的值,delete会改变.   

不同点:
  1. malloc不会调用构造函数,free不会调用析构函数.  

相同点 示例

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
	//malloc/free
	int *p1 = (int*)malloc(sizeof(int));
	*p1 = 888;
	cout << "p1地址:" << p1 << " p1值:" << *p1 << endl;
	free(p1);
	cout << "free p1地址:" << p1 << " free p1值:" << *p1 << endl;

	int *p2 = new int(888);
	cout << "p2地址:" << p2 << " p2值:" << *p2 << endl;

	delete p2;    //应该在delete之后,将指针指向nullptr,不能多次delete
	cout << "delete p2地址:" << p2 << " delete p1值:" << *p1 << endl;
	
	//free之后,应该将指针指向NULL
	p1 = NULL;
	//delete之后,应该将指针指向nullptr
	p2 = nullptr;

	cin.get();
	return 0;
}

new与malloc内存分配相同点

不同点 示例

#include <iostream>

using namespace std;

class People
{
public:
	People()
	{
		cout << "create people" << endl;
	}
	~People()
	{
		cout << "dispose people" << endl;
	}

private:

};

//malloc/free 在c++中,使用malloc不会触发构造函数,使用free释放不会触发析构函数
int main(int argc, char *argv[])
{
	cout << "执行开始" << endl;
	People *p1 = (People*)malloc(sizeof(People));
	free(p1);
	cout << "执行结束" << endl;
	cin.get();
	return 0;
}

在c++中,使用malloc不会触发构造函数,使用free释放不会触发析构函数

#include <iostream>

using namespace std;

class People
{
private:
	char *p;

public:
	People()
	{
		p = (char*)malloc(sizeof(char) * 1024 * 1024 * 128);  //分配128兆空间
		cout << "create people" << endl;
	}
	~People()
	{
		delete p;					      //释放空间
		cout << "dispose people" << endl;
	}
};

int main(int argc, char *argv[])
{
	People *people(new People);
	delete people; //单个对象用delete去释放

	cin.get();
	return 0;
}

在new分配实例的时候,触发构造函数,并进行分配128兆空间

在new分配实例的时候,触发构造函数,并进行分配128兆空间

在delete释放实例之后,触发析构函数,并把在构造函数的分配的内存进行释放

在delete释放实例之后,触发析构函数,并把在构造函数的分配的内存进行释放

delete使用注意事项

#include <iostream>

using namespace std;

class People
{
private:
	char *p;

public:
	People()
	{
		p = (char*)malloc(sizeof(char) * 1024 * 1024 * 128);  //分配128兆空间
		cout << "create people" << endl;
	}
	~People()
	{
		delete p;					      //释放空间
		cout << "dispose people" << endl;
	}
};

int main(int argc, char *argv[])
{
	//对于基本数据类型数组,delete与delete[]作用一样
	int *p = new int[10]{ 1,2,3,4,5,6,7,8,9,0 };
	//delete p;
	delete[] p;  

	//对于符合类型,单个对象用delete去释放,对象数组用delete[]去释放
	People *people(new People);
	delete people; //单个对象用delete去释放

	//delete[]释放单个对象,会一直调用析构函数,进行释放
	//delete[] people;

	cin.get();
	return 0;
}
秋风 2018-03-12