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 是有办法删除多余内存的,不过这个我还不会,就不讲了。
数组动态分配内存
这个是正版动态分配内存了,而且也非常简单,在主要用的是 new
和 delete
函数。
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 里的内存池,真正的内存池我看的不是很懂。