慕课网C++课程
nullptr
,NULL
是c语言语法,有二意,建议用nullptr
对指针设空#include "stdafx.h"#include // 智能指针
#include
using namespace std;
int main()
{// 在这个范围之外,unique_ptr被释放{auto i = unique_ptr(new int(10));cout << *i << endl;}// unique_ptrauto w = std::make_unique(10);cout << *(w.get()) << endl; // 10//auto w2 = w; // 编译错误如果想要把 w 复制给 w2, 是不可以的。// 因为复制从语义上来说,两个对象将共享同一块内存。// unique_ptr 只支持移动语义, 即如下auto w2 = std::move(w); // w2 获得内存所有权,w 此时等于 nullptrcout << ((w.get() != nullptr) ? (*w.get()) : -1) << endl; // -1cout << ((w2.get() != nullptr) ? (*w2.get()) : -1) << endl; // 10return 0;
}
// shared_ptr {//shared_ptr 代表的是共享所有权,即多个 shared_ptr 可以共享同一块内存。auto wA = shared_ptr(new int(20));{auto wA2 = wA;cout << ((wA2.get() != nullptr) ? (*wA2.get()) : -1) << endl; // 20cout << ((wA.get() != nullptr) ? (*wA.get()) : -1) << endl; // 20cout << wA2.use_count() << endl; // 引用计数 :2cout << wA.use_count() << endl; // 2} // WA2出了作用域,消亡//cout << wA2.use_count() << endl; cout << wA.use_count() << endl; // 1cout << ((wA.get() != nullptr) ? (*wA.get()) : -1) << endl; // 20}
// move 语法//将 wAA 对象 move 给 wAA2,意味着 wAA 放弃了对内存的所有权和管理,此时 wAA对象等于 nullptr。//而 wAA2 获得了对象所有权,但因为此时 wAA 已不再持有对象,因此 wAA2 的引用计数为 1。auto wAA = std::make_shared(30);auto wAA2 = std::move(wAA); // 此时 wAA 等于 nullptr,wAA2.use_count() 等于 1cout << ((wAA.get() != nullptr) ? (*wAA.get()) : -1) << endl; // -1cout << ((wAA2.get() != nullptr) ? (*wAA2.get()) : -1) << endl; // 30cout << wAA.use_count() << endl; // 0cout << wAA2.use_count() << endl;
// demo5-11.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include
#include
#include
using namespace std;// 具有shared_ptr指针的两个结构体
struct B;
struct A {shared_ptr pb;~A(){cout << "~A()" << endl;}
};
struct B {shared_ptr pa;~B(){cout << "~B()" << endl;}
};// 具有shared_ptr和weak_ptr指针的两个结构体
struct BW;
struct AW
{shared_ptr pb;~AW(){cout << "~AW()" << endl;}
};
struct BW
{weak_ptr pa;~BW(){cout << "~BW()" << endl;}
};// pa 和 pb 存在着循环引用,根据 shared_ptr 引用计数的原理,pa 和 pb 都无法被正常的释放。
// weak_ptr 是为了解决 shared_ptr 双向引用的问题。
void Test()
{cout << "Test shared_ptr and shared_ptr: " << endl;shared_ptr tA(new A()); // 1shared_ptr tB(new B()); // 1cout << tA.use_count() << endl;cout << tB.use_count() << endl;tA->pb = tB;tB->pa = tA;cout << tA.use_count() << endl; // 2cout << tB.use_count() << endl; // 2
}
void Test2()
{cout << "Test weak_ptr and shared_ptr: " << endl;shared_ptr tA(new AW());shared_ptr tB(new BW());cout << tA.use_count() << endl; // 1cout << tB.use_count() << endl; // 1tA->pb = tB;tB->pa = tA;cout << tA.use_count() << endl; // 1,weak_ptr指向tA,不会对tA的引用计数产生影响cout << tB.use_count() << endl; // 2
} // 当作用域结束后,Aw计数只有1,减一为0后,会正常释放,Aw消亡后,对BW的影响也消除int main()
{Test();Test2();return 0;
}
// demo5-12.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include
#include
using namespace std;// 编写一个函数,输入两个int型变量a,b
// 实现在函数内部将a,b的值进行交换。
void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
void swap2(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}int main()
{// 交换变量的测试int a = 3, b = 4;swap(a, b);assert(a == 4 && b == 3);a = 3, b = 4;swap2(&a, &b); // 用指针变量,需要传地址assert(a == 4 && b == 3);return 0;
}