C++的内存管理

c++内存管理方式:

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提 出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

内置类型:

int main()
{
	int* ptr1 = new int;
	int* ptr2 = new int(10);
	delete ptr1;
	delete ptr2;
return 0;
}

ptr1是申请1个int的空间,ptr2是申请一个int空间并将其初始化为10,delete是对空间进行释放

int* ptr1 = new int[10];
int* ptr2 = new int[10] {1, 2, 3, 4, 5};
delete []ptr1;
delete []ptr2;

 创建一个数组空间,ptr2是对内容进行初始化,删除时delete要加[]

自定义类型

对于自定义类型,malloc等函数不能进行初始化,但我们可以用new进行初始化

class A
{
public:
	A(int n=4)
		:_a(n)
	{
		cout <<"A()" << endl;
	}
	 A(const A& aa)
		 :_a(aa._a)
	{
		 cout << "A(const A&aa)" << endl;
	}
	 A& operator=(const A& aa)
	 {
		 _a = aa._a;
		 cout << "A& operator"<< endl;
		 return *this;
	 }
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};
int main()
{
A* p1 = new A;//调用构造
delete p1;//会自动调用析构
return 0;
}

new在对自定义类型进行处理时会自动调用构造函数,而delete会自动调用析构函数

int main()
{A* p2 = new A[10]{ 1,2,3,4,5 };
delete[] p2;
return 0;
}

特别注意,有析构函数时必须要加delete后的[],否则会崩溃,这是因为有析构函数时系统会多开4个字节空间存储元素个数,即一个int整形大小 ,所以在这里建议配对进行使用

 定位new表达式

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

使用场景:

定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义 类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化 

int main()
{
A* p1 = (A*)operator new(sizeof(A));
	new (p1)A(10);
	p1->~A();
	operator delete(p1);
return 0;
}

int main()
{
	A* p2 = (A*)operator new[](sizeof(A) * 10);
	for (int i = 0; i < 10; i++)
	{
		new(p2 + i)A(i);
	}
	for (int i = 0; i < 10; i++)
	{
		(p2 + i)->~A();
	}
	operator delete [](p2);
	return 0;
}

相关推荐

  1. C++内存管理

    2024-06-08 20:28:04       12 阅读
  2. C++内存管理模型

    2024-06-08 20:28:04       36 阅读
  3. C/C++——内存管理

    2024-06-08 20:28:04       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 20:28:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 20:28:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 20:28:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 20:28:04       20 阅读

热门阅读

  1. Vue进阶(八十八)前端测试工具介绍

    2024-06-08 20:28:04       10 阅读
  2. 一个可以自动生成随机区组试验的excel VBA小程序2

    2024-06-08 20:28:04       10 阅读
  3. 使用 Python 的 Tkinter 来创建 GUI 应用程序

    2024-06-08 20:28:04       11 阅读
  4. Debian的常用命令

    2024-06-08 20:28:04       10 阅读
  5. 在Debian系统上赋予普通用户ping 权限

    2024-06-08 20:28:04       9 阅读
  6. 【FPGA】arm数据总线和axi数据总线有什么异同点?

    2024-06-08 20:28:04       10 阅读
  7. Docker——容器技术的发展

    2024-06-08 20:28:04       8 阅读
  8. 数据仓库中数据质量如何提升

    2024-06-08 20:28:04       7 阅读
  9. Base64 编码表 参考

    2024-06-08 20:28:04       7 阅读