从智能指针、到move语义和右值引用

本文详细介绍了C++中的智能指针,包括shared_ptr和unique_ptr,以及如何避免内存泄露。接着,讨论了move语义的重要性,它通过右值引用提高效率,避免不必要的深复制。同时,解释了左值和右值的概念,以及左值引用和右值引用的使用场景。最后,通过实例展示了move语义在函数返回值优化中的应用。
摘要由CSDN通过智能技术生成

1. 智能指针

c++中,使用普通的指针可能会造成内存泄露,这可能是由于忘了delete,或者是程序提前return导致没法delete,例如:

void foo()
{
   
	myClass* ptr = new myClass;

	if (true)
		return;
	
	delete ptr; //无效的delete,因为函数已经return
}

因此我们想,最好指针自己能够在不需要的时候就自动delete,这就叫智能指针(smart pointer). c++中,能够实现”自动delete指针“的,就是class里的destructor了。所以一个想法就是:构造一个关于智能指针的class:

template<class T>
class auto_Pointer
{
   
private:
	T* my_ptr;
public:
	auto_Pointer(T* ptr=nullptr)
		:my_ptr(ptr)
	{
   
	}
	
	~auto_Pointer()
	{
   
		delete my_ptr;
	}
	
	//overload指针的“*”和“->"操作
	T& operator*() const {
   return *my_ptr;}
	T* operator->() const {
   return my_ptr;}
};

然后试一下:

class myClass
{
   
public:
	myClass()
	{
   
		cout << "myClass constructed" << endl;
	}
	~myClass()
	{
   
		cout << "myClass destructed" << endl;
	}
};

int main()
{
   
	auto_Pointer<myClass> ptr(new myClass);
	
	if (true)
	{
   
		cout << "if testing" << endl;
		return 0;
	}
	
    return 0;
}

main函数输出:

myClass constructed
if testing
myClass destructed

在main中没有显式地delete指针,但实际上是这么做了的。对比一下用普通指针的情况:

int main()
{
   
	myClass *ptr = new myClass();
	
	if (true)
	{
   
		cout << "if testing" << endl;
		return 0;
	}
	
	delete ptr;
    return 0;
}

结果是:

myClass constructed
if testing

程序也能报错,但实际上ptr是没有被delete的,这就会有内存泄露的风险。

以前c++有auto_ptr智能指针,c++11不用这个了,现在两大智能指针是shared_ptr和unique_ptr.

2. move语义

上面智能指针很好地解决了内存管理的问题,但还是会有问题。考虑下面例子:

int main(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值