c++11智能指针之基础概念

这篇具有很好参考价值的文章主要介绍了c++11智能指针之基础概念。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基础概念

1.内存泄漏:内存泄漏是指程序中已动态分配的堆内存由于某种原因因程序未释放或无法释放,导致程序运行速度减慢甚至系统崩溃等。

内存泄漏两种情况:

  • 堆内存泄漏:在堆上申请了资源,结束时,没有还给OS。
  • 资源泄漏:指系统资源,比如socket,文件描述符,因为有限制。创建而不归还,资源就会耗尽。

2.什么是智能指针
由于c++语言没有垃圾回收机制,必须自己去释放动态分配的堆内存,否则就回内存泄漏,解决这个问题就是使用智能指针。
智能指针对象中有一个指针,此指针存储的是动态创建对象的地址,用于生存期的控制,能够确保智能指针对象离开所在作用域是,自动正确的销毁动态创建的对象
3.RALL
资源获取即初始化,充分利用了c++语言局部对象自动销毁的特性来控制生命周期。
RALL过程总结:
1.设计一个类封装资源
2.在构造函数中初始化
3.在析构函数中进行销毁操作
4.使用时定义一个该类的局部对象

using namespace std;
class Int
{
private:
	int a = 10;
public:
	Int(int b=0):a(b){}
	~Int(){}
};
class Ptr
{
private:
	Int* p;
public:
	Ptr(Int* s) :p(s) {}
	~Ptr() 
	{ 
		delete p;
	}
};
int main()
{
	Ptr ptr(new Int(10));//调动构造函数创建对象,将堆区中对象地址给ptr
}

4.裸指针存在问题

  • 难以区分指针指向的是单个对象还是一组对象
  • 使用完指针之后无法判断是否应该销毁指针,因为无法判断指针是否“拥有”指向的对象
  • 无法确定使用delete关键字删除,还是其他特殊的销毁机制
  • 无法判断当前指针是否是空悬指针

5.auto_ptr的剖析

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
namespace xw
{
	template<class _Ty>
	class My_auto_ptr
	{
	public:
		typedef _Ty element_type;
	private:
		_Ty* _M_ptr;
	public:
		explicit My_auto_ptr(_Ty* p = nullptr) :_M_ptr(p) {}
		~My_auto_ptr() { delete _M_ptr; }

		_Ty* get()const { return _M_ptr; } //前面是否加const看_M_ptr所指之物(*_M_ptr)是否允许改变
	};
}
//值语义
class Int
{
private:
	int value = 10;
public:
	Int(int b = 0) :value(b) { cout << "create Int" << endl; }
	~Int() { cout << "Destory Int" << endl; }
	int& Value() { return value; }
	const int& Value()const { return value; }
	void PrintInt(){cout<<value<<endl;}
};

int fun(int i)
{
	xw::My_auto_ptr<Int>sp(new Int(10));
	if (i < 0)
	{
		throw std::out_of_range("i<0");
	}
	return i;
}

int main()
{
	int x = 0;
	try
	{
		x = fun(-10);
	}
	catch (std::out_of_range& e)
	{
		cout << e.what() << endl;
	}

}

6.auto_ptr辅助函数的实现

  • get返回指向被管理对象的指针
  • 重载 operator* (取值),operator->(成员访问),访问被管理对象
_Ty& operator*()const
{
	return *_M_ptr;
}
_Ty* operator->()const
{
	return _M_ptr;
}

int main()
{
	xw::My_auto_ptr<Int>sp(new Int(10));
	sp->PrintInt();
	(*sp).Value()=100; //.的优先级高于*
	sp.operator->()->PrintInt();
}

7.auto_ptr辅助函数的实现2

  • reset替换被管理对象
  • release释放被管理对象的所有权
void reset(_Ty *p=nullptr)
{
	delete _M_ptr;
	_M_ptr=p;
}

_Ty* relese()
{
	_Ty* temp=_M_ptr;
	_M_ptr=nullptr;
	return temp;
}
void Swap(My_auto_ptr&_Other)
{
	std::swap(this->_M_ptr,_Other._M_ptr);
}
int main()
{
	xw::My_auto_ptr<Int>sp(new Int(10));
	sp->PrintInt();
	sp.reset(new Int(20));
	sp->PrintInt();
	Int* p=sp.release();
	sp->PrintInt();//程序运行出错,此时给nullptr解引用了
}
//关于交换
int main()
{
	xw::My_auto_ptr<Int>sp(new Int(10));
	sp->PrintInt();
	xw::My_auto_ptr<Int>p2;  //p2._M_ptr=nullptr;
	p2.Swap(sp);
	sp->PrintInt();//error
}

8.auto_ptr的拷贝构造函数的问题

My_auto_ptr(const My_auto_ptr& _other) 
{
	//_M_ptr=_other._M-ptr;//浅拷贝 析构两次,产生失效指针,程序崩溃
	_M_ptr=new _Ty(*other);
}

//对象语义指的是面向对象意义下的对象,对象拷贝是禁止的
例如:文件的拷贝,即使是深拷贝,但是他们依然在同一个文件里面“a.txt”

void func()
{
	xw::My_auto_ptr<Int>(new Int[10]);//调用了10次构造函数
	return 
}

auto_ptr三大问题:文章来源地址https://www.toymoban.com/news/detail-429415.html

  • 赋值和复制会改变资源所有权,不符合人的直觉
  • 在STL容器中使用auto_ptr存在重大风险,因为容器内的元素必须支持可复制的可赋值(因为拷贝构造和赋值语句中没有const 修饰了,容易发生资源转移)
  • 不支持对象数组的操作
    C++11中已经舍弃auto_ptr

到了这里,关于c++11智能指针之基础概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 智能指针:C++中优雅的内存管理解决方案

    前言 欢迎来到💖小K💖的💞C++专栏💞,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,这是C和C++程序员的噩梦之一。本节将为大家带来解决办法—智能指针 1、简介 ✨智能指针是一个模板类,封装了裸指针,可以对指针进行安全的操作。 使用R

    2024年02月06日
    浏览(40)
  • “智能指针:C++中优雅的内存管理解决方案“

    前言 欢迎来到💖小K💖的💞C++专栏💞,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,这是C和C++程序员的噩梦之一。本节将为大家带来解决办法—智能指针 1、简介 ✨智能指针是一个模板类,封装了裸指针,可以对指针进行安全的操作。 使用R

    2024年02月05日
    浏览(37)
  • 【C++11(三)】智能指针详解--RAII思想&循环引用问题

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 相信学C++的同学或多或少的听说过 智能指针这个词,博主刚听见这个词时 ,觉得它应该很复杂,并且很高大上,但不 管是多牛的东西,都是人写

    2024年02月04日
    浏览(46)
  • C++11补充:智能指针如std::unique_ptr如何添加自定义的deleter

    关于智能指针的问题,有时候为了方便,需要在析构时附加一些清理操作,或者,有的指针本身来自C的库文件中,这时候,就非常期望能够使用自定义的deleter, 但是标准C++创建函数如std::make_unique / std::make_shared 等不支持创建带有自定义deleter的智能指针,这时,我们只能使用

    2024年02月07日
    浏览(48)
  • C++基础篇:09 智能指针与异常处理

            当一个常规指针离开作用域时,只有该指针变量所占用的内存空间(4/8字节)会释放,而它所指向的内存空间不会自动释放,当free、delete、delete[]语句忘记写、无法执行,就造成内存泄漏     ① 智能指针是一个封装了常规指针的类类型,并在该类中重载了 * - []运算

    2024年02月09日
    浏览(51)
  • 【Rust 基础篇】Rust Box 智能指针

    在 Rust 中, Box 是一种智能指针类型,用于在堆上分配内存并管理其生命周期。 Box 提供了堆分配的功能,并在所有权转移时负责释放内存。本篇博客将详细介绍 Rust 中 Box 智能指针的使用方法和相关概念。 Box 是一个指向堆上分配的值的指针。它提供了所有权转移和释放内存

    2024年02月16日
    浏览(41)
  • 【Rust 基础篇】Rust Rc 智能指针的使用

    在 Rust 中,Rc(Reference Counting)是一种智能指针,用于实现多所有权共享数据的引用计数。Rc 智能指针允许多个所有者共享相同的数据,并在没有任何所有者时自动释放数据。 本篇博客将详细介绍 Rust 中 Rc 智能指针的使用方法和相关概念,以及它在代码中的应用场景。 Rc 智

    2024年02月16日
    浏览(42)
  • C++11 新特性 ⑥ | 智能指针 unique_ptr、shared_ptr 和 weak_ptr

    目录 1、引言 2、unique_ptr 3、shared_ptr 4、weak_ptr 5、shared_ptr循环引用问题(面试题)

    2024年02月09日
    浏览(49)
  • C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

    目录 1、引言 2、什么是智能指针? 3、在Visual Studio中查看智能指针的源码实现 4、独占式指针unique_ptr 4.1、查看unique_ptr的源码实现片段 4.2、为什么unique_ptr的拷贝构造函数和复制函数被delete了?(面试题) 4.3、使用unique_ptr独占式智能指针的实例 5、共享式指针shared_ptr  5.1、查

    2024年02月08日
    浏览(44)
  • 神经网络基础-神经网络补充概念-11-向量化逻辑回归

    通过使用 NumPy 数组来进行矩阵运算,将循环操作向量化。 向量化的好处在于它可以同时处理多个样本,从而加速计算过程。在实际应用中,尤其是处理大规模数据集时,向量化可以显著提高代码的效率。

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包