动态内存

使用动态生存期的资源的类:
1,程序不知道自己需要使用多少对象;——容器
2,程序不知道所需对象的准确类型;——模板
3,程序需要在多个对象间共享数据。——动态内存

动态内存:
new,在动态内存中为对象分配空间并返回一个指向该对象的指针。
delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。我们传递给delete的指针必须指向动态分配的内存,或者是一个空指针。释放一块并非new分配的内存,或者将相同的指针值释放多次,其行为是未定义的。注意空悬指针。

int *p(new int(42));    //p指向动态内存
auto q=p;    //p和q指向相同的内存
delete p;    //p和q均变为无效
p=nullptr;        //指出p不再绑定到任何对象
#include 
using namespace std

shared_ptr, unique_ptr, weak_ptr.

shared_ptr<int> p2(new int(1024));    //只能使用直接初始化形式

shared_ptr<int> clone(int p)
{
    return shared_ptr<int>(new int(p));
}

shared_ptr<int> p3=make_shared<int>(42);
shared_ptr<string> p4=make_shared<string>(10,'9');

一个unique_ptr“拥有”它所指向的对象,与shared_ptr不同,某个时刻只有有一个unique_ptr指向一个给定对象,定义一个unique_ptr时,需要将其绑定到一个new返回的指针上,由于一个unique_ptr拥有它所指向的对象,因此unique_ptr不支持普通股的拷贝或赋值操作。
weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个shared_ptr管理的对象。
当我们创建一个weak_ptr时,要用一个shared_ptr来初始auto

p=make_shared<int>(42);
weak_ptr<int> wp(p);

wp弱共享;p的引用计数不改变,正是这一点是弱引用。

由于对象可能不存在,我们不能使用weak_ptr直接访问对象,而必须调用lock.

{
    //如果np不为空则条件成立
    //在if中,np与p共享对象
}

动态数组:1,new 2,allocator将分配和初始化分离,
1,int *pia=new int[get_size()]; //pia指向第一个int
typedef int arrT[42]; //表示数组类型的类型别名来分配一个数组
int *p=new arrT;
delete [] p;
标准库提供了一个可以管理new分配的数组的unique_ptr版本,为了用一个unique_ptr管理动态数组,我们必须在对象类型后面跟一对空方括号:
//up指向一个包含10个未初始化int的数组

unique_ptr<int[]> up(new int[10]);
up.release();    //自动用delete[]销毁其指针

与unique_ptr不同(可以直接使用下标运算符),shared_ptr不直接支持管理数组,如果希望使用shared_ptr管理一个动态数组,必须提供自己定义的删除器:

sp.reset();    //    使用我们提供的lambda释放数组,它使用delete[]

2,allocator类,allocator是一个模板,当一个allocator对象分配内存时,它会根据给定的对象类型来确定恰当的内存大小和对齐位置:

allocator<string> alloc;    //可以分配string的allocator对象 
auto const p =alloc.allocate(n);  //分配n个未初始化的string,为n个string分配了内存。 

标准库allocator类及其算法

allocator a
a.allocate(n)
a.deallocate(p,n)
a.construct(p,args)
a.destroy(p)
unintialized_copy(b,e,b2)
unintialized_copy_n(b,n,b2)
unintialized_fill(b,e,t)
unintialized_fill_n(b,n,t)

你可能感兴趣的:(c++学习,动态内存,指针,c++基础)