C++动态分配内存

动态分配内存相信大家都听说过,不过真正用到的时候却发现自己不会用它,直接人傻了,幸亏不是在考场上,否则人就没了。

下面我会讲三种动态分配内存的方法,大家快跟小编一起来看看吧。

vector 动态数组 (

我们都知道 vector 是可变长度数组,这也是 vector 的优点,我们可以利用 vector 来实现动态分配内存。

首先我们应该知道 vector 为了保证常数的复杂度,一般情况它实际占用的内存是 2 的次方级别的,换个意思说就是 vector 并不是严格的动态分配内存,它所占的内存会比你实际所用大一些。

我们知道 size() 函数是得到当前 vector 中的元素个数,但是它并不是当前 vector 所占用的实际内存,但是这个函数 capacity() 可以返回当前 vector 所占用的实际内存。

然后就要开始今天的主要内容了。

如果我们只想改变 vector 实际内存而不是想往里面插入元素,我们有一个函数叫做 reserve() 它可以规定 vector 的内存大小。

然后如果你想顺便把元素也插入进去的话,我们还有一个函数 resize() ,它可以顺便把元素填充进去(默认为 0),我们一般所指的动态分配内存用的就是这个函数。

// by longdie 
#include <bits/stdc++.h> 
using namespace std;
vector<int> g;
signed main() {
	g.reserve(1000000);
	int tmp = g.capacity();
	g.resize(100);
	return 0;
}	

但是就经过我的实验,这个好像是假的动态分配,就是说 resize()reserve() 这两个函数并不会真正的改变内存,他们只是不断扩大,而并不缩小,这样可以保证复杂度的正确,但是内存上就不一定对了,不过一般情况下还是可以用一下的。

更新一下:vector 是有办法删除多余内存的,不过这个我还不会,就不讲了。

数组动态分配内存

这个是正版动态分配内存了,而且也非常简单,在主要用的是 newdelete 函数。
new 函数的作用是申请内存空间,delete 函数的作用是释放内存,而且它们所获得的内存是存放在堆中的。

好像没啥可说的,具体放一下代码吧。

// by longdie 
#include <bits/stdc++.h> 
using namespace std;
signed main() {
	int *a = NULL;//定义指针
	a = new int[105];//获得内存
	delete[] a;//删除内存
	return 0;
}	

还是建议使用这个来进行,毕竟是真正能做到完全动态分配内存。

内存池

无论我们如何动态分配,我们最少的使用内存也不能少于我们实际需要的元素个数,所以我们可以开一个内存池用指针来解决问题(长链剖分中的套路)。

具体的我们开一个足够大的数组来模拟内存池,用一个固定指针来表示内存池的分配就可以了。

给出一个代码实现。

/// by longdie 
#include <bits/stdc++.h> 
using namespace std;
int c[1000000], *p = c ,*a;
int *get(int *a, int n) {
	a = p, p += n;
	return a;
}
signed main() {
	int n;
	n = 1000;
	a = get(a, n);//分配指针为a, 大小为n的数组空间
	a[10] = 1;
	cout << a[10] << '\n';
	return 0;
}

这个是真的不常用啊,不过这个可能能优化代码时间效率。

补充一句:这个内存池只是 OI 里的内存池,真正的内存池我看的不是很懂。

posted @ 2021-01-20 15:27  longdie  阅读(342)  评论(1编辑  收藏  举报