标签: C++Primer 学习记录 动态内存
int *pi = new int(1024); int *pi2 = new int(); // 值初始化为 0,*pi2的值为 0 vector<int> *ps = new vector<int>{1, 2, 3};
auto p1 = new auto(obj); // p1指向一个与 obj类型相同的对象 auto p2 = new auto{a, b}; // 错误
const int *pci = new const int(1024); // const作为类型的一部分,也要出现在 new的后面 const string *pcs = new const string; // 默认初始化一个 const的空 string
// 如果分配失败,抛出bad_alloc异常 int *p1 = new int(); // 如果分配失败,返回空指针 int *p2 = new (nothrow) int();
int *p(new int(42));
delete p;
p = nullptr;
shared_ptr<int> p1 = new int(1024); // 错误,必须使用直接初始化形式
shared_ptr<int> p2(new int(1024)); // 正确
shared_ptr<int> clone(int p) {
return new int(p); // 错误,隐式转换为 shared_ptr<int>
}
// 在函数被调用时 ptr被创建并初始化
void process(shared_ptr<int> ptr)
{
// 使用 ptr
} // ptr离开作用域,被销毁
// 使用此函数的正确方法是给它传递一个 shared_ptr
shared_ptr<int> p(new int(42)); // 引用计数为 1
process(p); // 值拷贝 p会递增它的引用计数;在 process中引用计数值为 2
int i = *p; // 正确,引用计数为 1
// 在传递一个临时的 shared_ptr后,就不能再用内置指针访问之前的内存了
int *x(new int(1024));
process(x); // 错误,不能将 int*转换为一个 shared_ptr<int>
process(shared_ptr<int>(x)) // 合法,但执行完此行代码后,智能指针所指向的内存会被释放!
int j = *x; // 错误, x是一个空悬指针
shared_ptr<int> p(new int(42)); // 引用计数为 1
int *q = p.get(); // 正确,但使用 q时要注意,不要让它管理的指针被释放
{
// 未定义,两个独立的 shared_ptr指向相同的内存
shared_ptr<int> (q);
} // 程序块结束,q被销毁,它所指向的内存被释放
int foo = *p; // 未定义,p所指向的内存已经被释放了
unique
来完成。如果不是,在改变之前要制作一份新的拷贝。if (!p.unique())
p.reset(new string(*p)); // 不是唯一用户,需要分配新的拷贝
*p += newVal; // 现在可以确定自己确定是唯一用户,可以改变对象的值
void f()
{
shared_ptr<int> sp(new int(42));
// 这段代码抛出一个异常,且在 f中未捕获
} // 在函数结束时 shared_ptr自动释放内存
void f()
{
int *ip = new int(42);
// 这段代码抛出一个异常,且在 f中未捕获
delete ip; // 在退出之前释放内存
} // 内存将永远都不会被释放
unique_ptr<int> p1(new int(42));
unique_ptr<int> p2(p1); // 错误, unique_ptr不支持拷贝
unique_ptr<int> p3;
p3 = p2; // 错误, unique_ptr不支持赋值
unique_ptr<int> p1(new int(42));
// release将 p1置为空,将所有权从 p1转移给 p2
unique_ptr<int> p2(p1.release());
unique_ptr<int> p3(new int(0));
// release将 p1置为空,reset将 p2置为空,再将所有权从 p3转移给 p2
p2.reset(p3.release());
p2.release(); // 错误, p2不会释放内存,而且丢失了指针
auto p = p2.release(); // 正确,但是要记得 delete(p)
unique_ptr<int> clone(int p) {
// 正确,从 int*创建一个 unique_ptr<int>
return unique_ptr<int> (new int(p));
}
// p指向一个类型为 objT的对象,并使用一个类型为 delT的对象释放 objT对象
// 它会调用一个名为 fcn的 delT类型对象
unique_ptr<objT, delT> p (new objT, fcn);
auto p = make_shared<int>(42);
weak_ptr<int> wp(p); // wp弱共享,p的引用计数为改变
if (shared_ptr<int> np = wp.lock()) { // 如果 np不为空,则条件成立
// 在 if中,np与 p共享对象
}
char arr[0]; // 错误,不能定义长度为 0的数组 char *cp = new char[0]; // 正确,但 cp不能解引用
int *pia = new int[10]; // 10个未初始化的 int int *pia2 = new int[10](); // 10个值初始化为 0的 int int *pia3 = new int[10](1); // 错误,不能在圆括号内指定初始值 int *pia4 = new int[10]{0, 1, 2}; // 在列表中给定初始化器 auto *pia5 = new auto[10](); // 错误,未给出初始化器 auto *pia6 = new auto[10]{0, 1, 2}; // 错误,花括号括起来的初始值无法与 new auto配合使用