轻盈曼妙,欲语还羞C++之: std::unique_ptr

C++ std::unique_ptr

/*************************************************************************
	> File Name: unique_ptr.cpp
	> Author: XXDK
	> Email: v.manstein@qq.com 
	> Created Time: Tue 18 Sep 2018 09:51:54 AM CST
 ************************************************************************/

#include<iostream>
#include<vector>
#include<memory>
#include<cstdio>
#include<fstream>
#include<cassert>
#include<functional>

using namespace std;

struct B 
{
	virtual void bar() { std::cout << "B:;bar\n"; }
	virtual ~B() = default;
};

struct D : B
{
	D() { std::cout << "D::D\n"; }
	~D() { std::cout << "D::~D\n"; }
	void bar() override { std::cout << "D::bar\n"; }
};

std::unique_ptr<D> pass_through(std::unique_ptr<D> p)
{
	p->bar();
	return p;
}

void close_file(std::FILE* fp) { std::cout << "close file...\n"; std::fclose(fp); }

int main()
{
	std::cout << "unique ownership semantics demo\n";
	{
		auto p = std::make_unique<D>(); ///< p manage D;
		auto q = pass_through(std::move(p));
		assert(!p); ///< now p manage null pointer.
		q->bar(); ///< q manage D;
	} ///< ~D
	
	std::cout << "\nruntime polymorphism demo\n";
	{
		std::unique_ptr<B> p = std::make_unique<D>();///< p manage D, point to Base class;
		p->bar();
		std::vector<std::unique_ptr<B>> v; ///< store unique_ptr to vector;
		v.push_back(std::make_unique<D>());
		v.push_back(std::move(p));
		v.emplace_back(new D);
		for(auto& p: v)
			p->bar();
	}///< ~D 3 times

	std::cout << "\ncustom deleter demo\n";
	std::ofstream("demo.txt") << 'x';
	{
		std::unique_ptr<std::FILE, void (*)(std::FILE*) > fp(std::fopen("demo.txt", "r"), close_file);

		if(fp)
			std::cout << (char)std::fgetc(fp.get()) << '\n';
	}///< invoke fclose only if fopen success.

	std::cout << "\ncustom lambda-expression deleter demo\n";
	{
		std::unique_ptr<D, std::function<void(D*)>> p(new D, [](D* ptr)
			{
				std::cout << "destorying from a custom deleter...\n";
				delete ptr;
			});

		p->bar();
	} ///< invoke lambda and destory D.

	std::cout << "\nArray form of unique_ptr demo\n";
	{
		std::unique_ptr<D[]> p(new D[3]);
	} ///< ~D 3 times.
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值