C++ 内存管理01->三把大刀

news/2024/7/20 13:02:19 标签: 内存管理

三把大刀

  1. 第一把 大刀:new
class point_ty{
4.	private:
5.		int x;
6.		int y;
7.	public:
8.		point_ty(int a, int b)
9.		{
10.			x = a;
11.			y = b;
12.		}
13.		void show()
14.		{
15.			cout << "x:" << x << " y:" << y << endl;
16.		}
17.	
18.	};

有如下代码:

point_ty *ptr = new point_ty(1, 2);

其实编译器转化为以下代码:

point_ty *ptr;
	try
	{
		void *mem = operator new(sizeof(point_ty)); //1 分配内存
		ptr = static_cast<point_ty *>(mem);//2.类型转换
		ptr->point_ty(1,2); //3.调用构造函数(只有编译器可以直接调用构造函数)
	}
	catch(std::bad_alloc)
	{
	
	
	}

Operator new 可以查看源码如下:
其实也就是使用malloc获得内存
在这里插入图片描述
如果使用完毕要释放内存如:delete ptr;
编译器做以下动作:
Ptr->~point_ty();//调用析构函数
Operator delete(ptr);//释放内存
Operator delete的源码如下:

2. 第二把刀 array new

class point_ty{
private:
	int x;
	int y;
public:
	point_ty(int a, int b)
	{
		x = a;
		y = b;
		cout << this << " x:" << x << " y:" << y << endl;
	}
	point_ty():x(0), y(0)
	{
		cout << this << " x:" << x << " y:" << y << endl;
	}
	void show()
	{
		cout <<this<< " x:" << x << " y:" << y << endl;
	}
	~point_ty()
	{
		cout << this << " x:" << x << " y:" << y << endl;

	}
};
void play()
{
	cout << "class point_ty size:" << sizeof(point_ty) << endl;
	point_ty *ptr = new point_ty[3];
	//地址间隔为8,因为类大小为8
	cout << endl;
	point_ty *temp = ptr;
	for (int i = 0; i < 3;i++)
	{
		new(temp++)point_ty(i + 1, i + 2);
	}
	cout << endl;
	delete []ptr;

}

在这里插入图片描述
可以看出构造函数的执行顺序和析构函数的执行顺序相反。
其中:
point_ty *ptr = new point_ty[3];
//1.会执行三次构造函数
//2.会自带一个cookie,最重要的功能是记录长度。其实也就是为了和free配合。Cookie会占用内存。

在这里插入图片描述
如果在释放内存的时候没有加[],即delete ptr;//非delete []ptr;则就会造成内存泄漏三个对象之中只会执行其中一个对象的析构。
在这里插入图片描述
在这里要提一点:如果析构函数有意义,在释放的时候如果不加[]就会出错。这里主要是内存解析出错。
在这里插入图片描述
先看看普通变量的空间分布图:
在这里插入图片描述
然后看看对象空间分布图:
就比如:
point_ty *ptr = new point_ty[5];
在这里插入图片描述
现在解释为什么不加[]报错。前提(析构函数有意义),
因为它把析构的时候是从多算了一块就是记录数量的那部分,造成整个布局都乱了。
delete和delete[],在布局上是不同的。Delete []会记录个数

第三把 placement new

其实也就是将对象构建于一个存在的内存中使用方法如下
char *buf = (char *)malloc(sizeof(point_ty));
point_ty *ptr = new(buf)(1,2);

Delete buf;
其中编译器将第二句转为:
Point_ty *ptr;
Try
{
Void *mem = operator new(sizeof(point_ty),buf);
ptr = static_cast<point_ty *>(mem);
pc->point_ty(1,2);
}
Catch(std::bad_alloc)
{

}
其中operator new源码如下:
在这里插入图片描述
这也就是可以实现自己调用构造函数了。


http://www.niftyadmin.cn/n/1428135.html

相关文章

关于可配置程序设计的简单理解

写这篇文章的目的&#xff0c;不在于说明相应的细节&#xff0c;而在于理解可配置的一些含义。 代码编写中存在的一些问题 在程序设计中&#xff0c;通过代码编写的逻辑是存在这样子的一个问题的。 假如你将程序的逻辑全部放在代码中&#xff08;即使是字符串&#xff09;&am…

Some Thoughts

自己的经历 每个人对自己想法影响最深的其实是自己的经历&#xff0c;这些经历有好有坏&#xff0c;包括自己从小到大吃到的&#xff0c;闻到的&#xff0c;看到的&#xff0c;听到的&#xff0c;学到的等等&#xff0c;其中家庭环境对个人的影响最甚。人出生时是一块块形状不…

C++内存管理02-接管三把刀为内存池做准备

内存管理02->接管三把刀为内存池做准备 其实我们做内存管理就是自己重载new。 接下来我们先看看能不能接管new&#xff0c;自己掌控。 1. 先接管全局new void *MyMalloc(size_t size) {return malloc(size); } void MyDelete(void *ptr) {free(ptr); }inline void *oper…

python一些模块的安装

1.windows下python安装Numpy、Scipy、matplotlib模块 转自&#xff1a;原文 网上找了半天&#xff0c;终于把要安装的资料找到了。其他的不怎么全&#xff0c;就自己再次总结一下写。 我自己安装的是python 2.7。所以以下的东东都是针对2.7的软件。 numpy :http:/…

C++ 内存管理03-内存池01

内存池01 通过我前面的讲解&#xff0c;你已经知道每调用malloc一次都会产生cookie或者其他消耗资源的东西&#xff0c;它们是占用内存的&#xff0c;总之&#xff0c;减少malloc 的调用总是好的。于是为了解决这个问题&#xff0c;内存池出场了。 假设你需要new 1000个对象&a…

C++ 内存管理03-内存池02

内存池02 通过上一节的介绍&#xff0c;你应该能够对内存管理有个大概的了解&#xff0c;上一节提到为了设计内存池增加了一个指针next,但它额为增加了4个字节&#xff0c;这不是我们所需要的。于是对它进行了优化&#xff0c;先看代码和云心结果 #define _CRT_SECURE_NO_W…

python中 numpy的基本使用

1.给numpy矩阵添加一列 原文出处 问题的定义&#xff1a; 首先我们有一个数据是一个m n的numpy矩阵现在我们希望能够进行给他加上一列变成一个m(n1)的矩阵 import numpy as np a np.array([[1,2,3],[4,5,6],[7,8,9]]) b np.ones(3) c np.array([[1,2,3,1],[4,5,6,1],[7,8…

C++ 内存管理03-内存池03(自己写一个allocator)

通过上节的介绍已经改进了内存设计第一版的缺点&#xff0c;但是依然有一个问题&#xff0c;那就是&#xff0c;我们是学面向对象的&#xff0c;不可能每建立一个类&#xff0c;就都写一个内存管理&#xff0c;做重复的动作&#xff0c;那就太没意思了&#xff0c;于是就想着自…