智能指针介绍

学习C语言的人一直在接触裸指针,裸指针有很多不好用的地方(对于本菜鸡来讲),比如有以下原因:

  1. 资源忘记释放,导致资源泄露
  2. 同一资源释放多次,程序崩溃

智能指针的出现就很好的解决了上面的问题。
C++11库里面,提供了带引用计数的智能指针 和 不带引用计数的智能指针,这篇文章主要介绍他们的原理和应用和场景,包括auto_ptr, scoped_ptr, unique_ptr, shared_ptr, weak_ptr

自己实现智能指针

为了更好理解智能指针的原理,我们最好自己实现一个简单地智能指针窥探一下基本原理。利用栈上对象出作用于会自动析构这一特点,把资源释放的代码放到析构函数中执行。

template <typename T>
class CSmartPtr
{
public:CSmartPtr(T *ptr = nullptr) : mptr(ptr) {}~CSmartPtr() { delete mptr; }private:T *mptr;
};int main()
{CSmartPtr<int> ptr(new int);/*ptr是栈上的智能指针对象,不管是函数正常执行完还是运行过程异常栈上对象都会自动调用析构函数,在析构函数中进行delete,保证释放资源*/return 0;
}

1. 智能指针体现在把裸指针进行了一次面向对象的封装,在构造函数中初始化地址,析构函数中负责释放资源。
2. 利用栈上对象出作用于自动析构这一特点,保证了资源的释放。

有个面试问题问“能不能在对象定义智能指针?”,比如*CSmartPtr p = new CSmartPtr(new int);
p虽然是智能指针类型,但是实质上还是一个裸指针,因此p还是需要进行手动delete,又回到了裸指针面临的问题。

当然要做到智能指针和裸指针使用相似,需要重载 ** * 和 -> **函数

#include<iostream>
using namespace std;template <typename T>
class CSmartPtr
{
public:CSmartPtr(T *ptr = nullptr) : mptr(ptr) {}~CSmartPtr() { delete mptr; }T &operator*() { return *mptr; }const T &operator*() const { return *mptr; }T &operator->() { return mptr; }const T &operator->() const { return mptr; }private:T *mptr;
};int main()
{CSmartPtr<int> ptr(new int);*ptr = 20;cout << *ptr << endl;return 0;
}

上面的使用方法已经和普通的智能指针很想死了,但还是有着很大的问题,像下面:

int main()
{CSmartPtr<int> ptr1(new int);CSmartPtr<int> ptr2(ptr1);return 0;
}

这个一运行直接崩溃,问题出在默认的的构造函数做的是浅拷贝,两个指针都持有一个new int资源,ptr2先释放,ptr1再重复释放资源,因此导致崩溃。

现在看看C++库中提供的智能指针的怎么解决的。

不带引用计数的智能指针

  1. auto_ptr
    先看一下主要源码
template<class _Ty>class auto_ptr{	// wrap an object pointer to ensure destruction
public:typedef _Ty element_type;explicit auto_ptr(_Ty * _Ptr = nullptr) noexcept: _Myptr(_Ptr){	// construct from object pointer}/*这里是auto_ptr的拷贝构造函数,_Right.release()函数中,把_Right的_Myptr赋为nullptr,也就是换成当前auto_ptr持有资源地址*/auto_ptr(auto_ptr& _Right) noexcept: _Myptr(_Right.release()){	// construct by assuming pointer from _Right auto_ptr}_Ty * release() noexcept{	// return wrapped pointer and give up ownership_Ty * _Tmp = _Myptr;_Myptr = nullptr;return (_Tmp);}
private:_Ty * _Myptr;	// the wrapped object pointer
};

从源码可以看到,只有最后一个auto_ptr智能指针持有资源,原来的auto_ptr都被赋nullptr了

int main()
{auto_ptr<int> p1(new int);auto_ptr<int> p2 = p1;*p1 = 10;return 0;
}

这里可以注意到p1已经是个空指针了,访问空指针的指向是一个很危险的操作。

上面的程序,如果不了解auto_ptr很容易出现严重的问题。
现在考虑一个问题,auto_ptr能不能使用在容器当中?

int main()
{vector<auto_ptr<int>> vec;vec.push_back(auto_ptr<int>(new int(10)));vec.push_back(auto_ptr<int>(new int(20)));vec.push_back(auto_ptr<int>(new int(30)));//打印出10cout << *vec[0] << endl;vector<auto_ptr<int>> vec2 = vec;/*这里由于上面vector容器的拷贝,相当于容器中的每一个元素都进行了拷贝构造,原来的vec智能指针就成nullptr了*/
}

因此,不要再容易中荣勇auto_ptr,C++最好不用auto_ptr,除非应用场景非常简单!
【总结】:auto_ptr处理了浅拷贝的问题,把前面的指针都置为nullptr

  1. scoped_ptr
    浏览下scoped_ptr源码
template<class T> class scoped_ptr // noncopyable
{
private:T * px;/*私有化拷贝构造函数和赋值函数,这样scoped_ptr的智能指针对象就不支持这两种操作,从根本上杜绝浅拷贝的发生*/scoped_ptr(scoped_ptr const &);scoped_ptr & operator=(scoped_ptr const &);typedef scoped_ptr<T> this_type;/*私有化逻辑比较运算符重载函数,不支持scoped_ptr的智能指针对象的比较操作*/void operator==( scoped_ptr const& ) const;void operator!=( scoped_ptr const& ) const;public:typedef T element_type;explicit scoped_ptr( T * p = 0 ): px( p ) // never throws{
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)boost::sp_scalar_constructor_hook( px );
#endif}#ifndef BOOST_NO_AUTO_PTR/*支持从auto_ptr构造一个scoped_ptr智能指针对象,但是auto_ptr因为调用release()函数,导致其内部指针为nullptr*/explicit scoped_ptr( std::auto_ptr<T> p ) BOOST_NOEXCEPT : px( p.release() ){
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)boost::sp_scalar_constructor_hook( px );
#endif}#endif/*析构函数,释放智能指针持有的资源*/~scoped_ptr() // never throws{
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)boost::sp_scalar_destructor_hook( px );
#endifboost::checked_delete( px );}
};

私有化拷贝构造函数和赋值函数,这样scoped_ptr的智能指针对象就不支持这两种操作,从根本上杜绝浅拷贝的发生。因此,scoped_ptr也不能用在容器中,容器相互拷贝或者复制,就会引起scoped_ptr的拷贝构造和赋值,编译错误。
【总结】auto_ptr可以任意转移资源的所有权,而scoped_ptr不会转移所有权(拷贝构造和赋值被禁止)

  1. unique_ptr
template<class _Ty,class _Dx>	// = default_delete<_Ty>class unique_ptr: public _Unique_ptr_base<_Ty, _Dx>{	// non-copyable pointer to an object
public:typedef _Unique_ptr_base<_Ty, _Dx> _Mybase;typedef typename _Mybase::pointer pointer;typedef _Ty element_type;typedef _Dx deleter_type;/*提供了右值引用的拷贝构造函数*/unique_ptr(unique_ptr&& _Right) noexcept: _Mybase(_Right.release(),_STD forward<_Dx>(_Right.get_deleter())){	// construct by moving _Right}/*提供了右值引用的operator=赋值重载函数*/unique_ptr& operator=(unique_ptr&& _Right) noexcept{	// assign by moving _Rightif (this != _STD addressof(_Right)){	// different, do the movereset(_Right.release());this->get_deleter() = _STD forward<_Dx>(_Right.get_deleter());}return (*this);}/*交换两个unique_ptr智能指针对象的底层指针和删除器*/void swap(unique_ptr& _Right) noexcept{	// swap elements_Swap_adl(this->_Myptr(), _Right._Myptr());_Swap_adl(this->get_deleter(), _Right.get_deleter());}/*通过自定义删除器释放资源*/~unique_ptr() noexcept{	// destroy the objectif (get() != pointer()){this->get_deleter()(get());}}/*unique_ptr提供->运算符的重载函数*/_NODISCARD pointer operator->() const noexcept{	// return pointer to class objectreturn (this->_Myptr());}/*返回智能指针对象底层管理的指针*/_NODISCARD pointer get() const noexcept{	// return pointer to objectreturn (this->_Myptr());}/*提供bool类型的重载,使unique_ptr对象可以直接使用在逻辑语句当中,比如if,for,while等*/explicit operator bool() const noexcept{	// test for non-null pointerreturn (get() != pointer());}/*功能和auto_ptr的release函数功能相同,最终也是只有一个unique_ptr指针指向资源*/pointer release() noexcept{	// yield ownership of pointerpointer _Ans = get();this->_Myptr() = pointer();return (_Ans);}/*把unique_ptr原来的旧资源释放,重置新的资源_Ptr*/void reset(pointer _Ptr = pointer()) noexcept{	// establish new pointerpointer _Old = get();this->_Myptr() = _Ptr;if (_Old != pointer()){this->get_deleter()(_Old);}}/*删除了unique_ptr的拷贝构造和operator=赋值函数,因此不能做unique_ptr智能指针对象的拷贝构造和赋值,防止浅拷贝的发生*/unique_ptr(const unique_ptr&) = delete;unique_ptr& operator=(const unique_ptr&) = delete;};

从上面看到,unique_ptr有一点和scoped_ptr做的一样,就是去掉了拷贝构造函数和operator=赋值重载函数,禁止用户对unique_ptr进行显示的拷贝构造和赋值,防止智能指针浅拷贝问题的发生。

但是unique_ptr提供了带右值引用参数的拷贝构造和赋值,也就是说,unique_ptr智能指针可以通过右值引用进行拷贝构造和赋值操作,或者在产生unique_ptr临时对象的地方,如把unique_ptr作为函数的返回值时,示例代码如下:

//示例1
unique_ptr<int> ptr(new int);
unique_ptr<int> ptr2 = move(ptr);//使用了右值引用的拷贝构造
ptr2 = move(ptr);//使用了右值引用的operator=重载函数
}
//示例2
unique_ptr<int> test_uniqueptr()
{unique_ptr<int> ptr1(new int);return ptr1;
}
int main()
{//调用上面函数,return ptr1,此时调用右值引用的拷贝构造unique_ptr<int> ptr = test_uniqueptr();//延长了ptr1的生命周期return 0;
}

unique_ptr还提供了reset重置资源,swap交换资源等函数。
可以看到,unique_ptr从名字就可以看出来,最终也是只能有一个该智能指针引用资源,因此建议在使用不带引用计数的智能指针时,可以优先选择unique_ptr智能指针。

带引用计数的智能指针shared_ptr 和 weak_ptr

当允许多个智能指针指向同一个资源的时候,每一个智能指针都会给资源的引用计数+1,析构-1,最后一个智能指针把资源的引用计数从1减到0,才真正释放了这个资源。

对整数的++或者–操作并不是线程安全的,因此share_ptr和weak_ptr底层的引用计数已经通过CAS操作。

private:/*下面这两个是shared_ptr的成员变量,_Ptr是指向内存资源的指针,_Rep是指向new出来的计数器对象的指针,该计数器对象包含了资源的一个引用计数器count*/element_type * _Ptr{nullptr};_Ref_count_base * _Rep{nullptr};

因此,shared_ptr智能指针的资源引用计数器在内存的heap堆上。shared_ptr一般被称作强智能指针,weak_ptr被称作弱智能指针,它们有下边两个非常重要的应用场景需要注意。

智能指针的交叉引用(循环引用)问题

看下面示例

#include <iostream>
#include <memory>
using namespace std;class B; // 前置声明类B
class A
{
public:A() { cout << "A()" << endl; }~A() { cout << "~A()" << endl; }shared_ptr<B> _ptrb; // 指向B对象的智能指针
};
class B
{
public:B() { cout << "B()" << endl; }~B() { cout << "~B()" << endl; }shared_ptr<A> _ptra; // 指向A对象的智能指针
};
int main()
{shared_ptr<A> ptra(new A());// ptra指向A对象,A的引用计数为1shared_ptr<B> ptrb(new B());// ptrb指向B对象,B的引用计数为1ptra->_ptrb = ptrb;// A对象的成员变量_ptrb也指向B对象,B的引用计数为2ptrb->_ptra = ptra;// B对象的成员变量_ptra也指向A对象,A的引用计数为2cout << ptra.use_count() << endl; // 打印A的引用计数结果:2cout << ptrb.use_count() << endl; // 打印B的引用计数结果:2/*出main函数作用域,ptra和ptrb两个局部对象析构,分别给A对象和B对象的引用计数从2减到1,达不到释放A和B的条件(释放的条件是A和B的引用计数为0),因此造成两个new出来的A和B对象无法释放,导致内存泄露,这个问题就是“强智能指针的交叉引用(循环引用)问题”*/return 0;
}

可以看到,A和B对象并没有进行析构,通过上面的代码示例,能够看出来“交叉引用”的问题所在,就是对象无法析构,资源无法释放,那怎么解决这个问题呢?请注意强弱智能指针的一个重要应用规则:定义对象时,用强智能指针shared_ptr,在其它地方引用对象时,使用弱智能指针weak_ptr。
弱智能指针weak_ptr区别于shared_ptr之处在于:

  1. weak_ptr不会改变资源的引用计数,只是一个观察者的角色,通过观察shared_ptr来判定资源是否存在
  2. weak_ptr持有的引用计数,不是资源的引用计数,而是同一个资源的观察者的计数
  3. weak_ptr没有提供常用的指针操作,无法直接访问资源,需要先通过lock方法提升为shared_ptr强智能指针,才能访问资源
    那么上面的代码怎么修改,**也就是如何解决带引用计数的智能指针的交叉引用问题,**代码如下:
#include <iostream>
#include <memory>
using namespace std;class B; // 前置声明类B
class A
{
public:A() { cout << "A()" << endl; }~A() { cout << "~A()" << endl; }weak_ptr<B> _ptrb; // 指向B对象的弱智能指针。引用对象时,用弱智能指针
};
class B
{
public:B() { cout << "B()" << endl; }~B() { cout << "~B()" << endl; }weak_ptr<A> _ptra; // 指向A对象的弱智能指针。引用对象时,用弱智能指针
};
int main()
{// 定义对象时,用强智能指针shared_ptr<A> ptra(new A());// ptra指向A对象,A的引用计数为1shared_ptr<B> ptrb(new B());// ptrb指向B对象,B的引用计数为1// A对象的成员变量_ptrb也指向B对象,B的引用计数为1,因为是弱智能指针,引用计数没有改变ptra->_ptrb = ptrb;// B对象的成员变量_ptra也指向A对象,A的引用计数为1,因为是弱智能指针,引用计数没有改变ptrb->_ptra = ptra;cout << ptra.use_count() << endl; // 打印结果:1cout << ptrb.use_count() << endl; // 打印结果:1/*出main函数作用域,ptra和ptrb两个局部对象析构,分别给A对象和B对象的引用计数从1减到0,达到释放A和B的条件,因此new出来的A和B对象被析构掉,解决了“强智能指针的交叉引用(循环引用)问题”*/return 0;
}

自定义删除器

~unique_ptr() noexcept
{	// destroy the object
if (get() != pointer()){this->get_deleter()(get()); // 这里获取底层的删除器,进行函数对象的调用}
}

从unique_ptr的析构函数可以看到,如果要实现一个自定义的删除器,实际上就是定义一个函数对象而已,示例代码如下:

class FileDeleter
{
public:// 删除器负责删除资源的函数void operator()(FILE *pf){fclose(pf);}
};
int main()
{// 由于用智能指针管理文件资源,因此传入自定义的删除器类型FileDeleterunique_ptr<FILE, FileDeleter> filePtr(fopen("data.txt", "w"));return 0;
}

当然这种方式需要定义额外的函数对象类型,不推荐,可以用C++11提供的函数对象function和lambda表达式更好的处理自定义删除器,代码如下:

int main()
{// 自定义智能指针删除器,关闭文件资源unique_ptr<FILE, function<void(FILE*)>> filePtr(fopen("data.txt", "w"), [](FILE *pf)->void{fclose(pf);});// 自定义智能指针删除器,释放数组资源unique_ptr<int, function<void(int*)>>arrayPtr(new int[100], [](int *ptr)->void {delete[]ptr; });return 0;
}

https://blog.csdn.net/QIANGWEIYUAN/article/details/88562935?spm=1001.2014.3001.5501

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 强哥原创管理方法论之“粉丝经济管理学”

    内容即将登场......

    2024/4/18 11:07:43
  2. c#窗体猜数字小游戏(初级版)

    小游戏的简单实现,这种小游戏非常适合初学者,能够提升对编程的兴趣。using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; usin…...

    2024/4/14 20:59:13
  3. Python字符串基本操作:统计字符串中文字出现的次数,输出字符串中出现最多的一个字符,并输出该字出现次数

    Python语言基础-2.8字符串基本操作-第3关&#xff1a;统计字频 # -*- coding: utf-8 -*- """ Created on Mon Sep 7 15:23:19 2020author: hyr 拼接&#xff0c;统计字数&#xff0c;将空格改为换行&#xff0c;查找子串&#xff0c; """songs…...

    2024/5/6 3:32:42
  4. 结合Redis在Spring架构体系中使用雪花算法

    前言 分布式ID生成策略有多种&#xff0c;各有利弊。这里记录下在工作中我结合Redis在Spring架构体系中使用雪花算法生成分布式ID的方式。 一、代码部分 import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.spr…...

    2024/4/14 20:59:13
  5. 微积分的本质

    一、概论 圆的面积为什么等于πrr? 圆的周长等于2πr。(为什么呢&#xff1f;) 为了求圆的面积&#xff0c;我们把圆剪成一个一个环&#xff0c;这符合数学的对称性&#xff0c;而当数学复合对称性时&#xff0c;数学往往会给你奖励 圆的面积等于每一个圆环的面积相加 每个圆…...

    2024/4/14 20:59:13
  6. python作业7-8

    Python第7-8天作业 作业1&#xff1a;有一堆硬币&#xff0c;每次只能拿一个或者两个&#xff0c;求最少多少次可以拿完硬币 [10, 8, 5, 3, 27, 99] num 0 ls [10, 8, 5, 3, 27, 99] for i in ls:a i % 2if a 0:num i // 2 numelse:num i // 2 num 1 print("需…...

    2024/4/18 15:01:43
  7. Python第三次(上)

    笔记在&#xff08;下&#xff09;篇 实验要求&#xff08;主要针对选择结构&#xff09; 1、从键盘输入3个数&#xff0c;求最大值 2、买彩票&#xff0c;如果体彩中了500万&#xff0c;我买车、资助希望工程、去欧洲旅游&#xff0c;否则我买下一期体彩&#xff0c;继续烧高…...

    2024/4/7 3:09:48
  8. Scala-Day3

    Scala初步 博主今天接着昨天的继续学习&#xff0c;继续记录了。 1.4标识符的命名规范 Scala对各种变量、方法、函数等命名时使用的字符序列称为标识符。即&#xff1a;凡是自己可以起名字的地方都叫标识符 1&#xff09;命名规则 Scala中的标识符声明&#xff0c;基本和Jav…...

    2024/4/14 21:00:09
  9. 使数组的左下三角元素中的值乘以n

    1 题目 函数&#xff1a;fun(int a[][N], int n) 功能&#xff1a;使数组的左下三角元素中的值乘以n 描述&#xff1a;程序定义了 N*N 的二维数组&#xff0c;并在主函数中自动赋值。 举例&#xff1a; 若 n 的值为3&#xff0c;a数组中的值为 1 9 7 3 9 7 2 3 8 则返回主程序后…...

    2024/4/14 20:59:39
  10. Vue--过渡与动画--使用/教程/实例

    原文网址 简介 说明 本文用示例介绍Vue.js的过渡与动画的用法。 官网 进入/离开 & 列表过渡 — Vue.js 过渡基础 简介 过渡的类名 在进入/离开的过渡中&#xff0c;会有 6 个 class 切换。对于这些在过渡中切换的类名来说&#xff0c;如果你使用一个没有名字的 <…...

    2024/4/14 21:00:04
  11. 力扣:125. 验证回文串

    1、先将字符串中的大写字母变成小写字母&#xff0c; 再用两个指针i和j分别从字符串开头和结尾开始相向迭代&#xff0c;如果遇到非字母和数字字符则跳过&#xff0c;然后判断i和j指针所指向的字符是否相等&#xff0c;不相等则返回false&#xff0c;如果一直相等&#xff0c;则…...

    2024/5/1 20:33:46
  12. JVM(18):运行时常量池、图示举例方法区的使用、方法区的演进细节

    一、运行时常量池 运行时常量池&#xff08;Runtime constant Poo1&#xff09;是方法区的一部分。常量池表(Constant Pool Table)是class文件的一部分&#xff0c;用于存放编译期生成的各种字面量与符号引用&#xff0c;这部分内容将在类加载后存放到方法区的运行时常量池中。…...

    2024/4/20 7:53:24
  13. 构造Strudent类,根据姓名查询出总成绩

    根据姓名查询出人是否存在&#xff0c;并且算出总成绩 代码描述 package 基本数据操作; import java.util.Scanner; class Student{String name;int Chinesescore;int Mathscore;int Englishscore;public Student(){}public void display() {System.out.println("姓名&am…...

    2024/4/14 20:59:49
  14. AEJoy —— 表达式之从图像中采样颜色数据【JS】

    效果图 使用 sampleImage() 从背景层拾取颜色 想法 自从表达式出现以来,表达式作者就一直想要一种访问层的颜色和 alpha 像素数据的方法。已经有一些第三方解决方案,但是随着 AE CS3 的到来,我们现在有了一种优雅而强大的方法来获取这些数据。在这里,我们将使用这个新工具…...

    2024/4/14 20:59:44
  15. 配置MybatisPlus分页插件

    MybatisPlus内置了分页的处理&#xff08;和PageHelper类似&#xff0c;但是不一样&#xff09; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extensio…...

    2024/4/14 20:59:59
  16. 【错误记录】Windows 控制台程序编译报错 ( fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory )

    文章目录一、报错信息二、解决方案一、报错信息 使用 Visual Studio 2019 编译 WIndows 控制台程序 , 报错信息如下 : 1>------ 已启动生成: 项目: hacktool, 配置: Debug Win32 ------ 1>HackCommand.cpp 1>Y:\002_WorkSpace\002_VS\MobileGameModify\hacktool\CNet…...

    2024/4/18 15:29:52
  17. 强哥原创管理方法论之“掌纹管理学”

    1、事业线 内容编辑中... 2、生命线 3、感情线 4、智慧线 5、婚姻线...

    2024/4/20 10:06:41
  18. mybatis根据数据库表自动生成实体类、mapper接口和xml

    maven配置 <build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><configuration> <!-- 配置文件的位置 --&g…...

    2024/4/15 12:19:11
  19. 【python-NOJ-44】【001】—第五季【类】—朋友圈(并查集)

    题目描述&#xff1a; 解析&#xff1a; 这个问题抽象为求一个图的连通子图的个数。可以采用DFS遍历&#xff0c;求出连通度&#xff1b;或者采用并查集。 此题使用使用并查集。 &#xff08;1&#xff09;初始化&#xff1a;将每个节点的父节点初始化为自己&#xff0c;此时…...

    2024/4/14 20:59:49
  20. Mac下Jetbrains IDEA 2021.2字体发虚问题解决

    最近在Mac上升级Jetbrains IDEA到2021.2&#xff0c;发现使用Jetbrains Mono字体的编辑器字体发虚&#xff0c; 显示情况如下&#xff1a; 截图肉眼可能没那么明显&#xff0c;但在4k显示器下 线条粗细不均 看着非常难受 谷歌了一下&#xff0c;发现了Jetbrains官方的一篇关于…...

    2024/4/18 9:58:03

最新文章

  1. 存储或读取时转换JSON数据

    一、 数据库类型 二、使用Hutool工具 存储时将数据转换为JSON数据 获取时将JSON数据转换为对象 发现问题&#xff1a; 原本数据对象是Address 和 Firend但是转换完成后数据变成了JSONArray和JSONObject 三、自定义TypeHandler继承Mybatis的BaseTypeHandler处理器 package …...

    2024/5/6 19:19:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/6 9:38:23
  3. 解决前端性能瓶颈:高效处理大量数据渲染与复杂交互的策略与优化方法

    ✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、分页加载数据 二、虚拟滚动 三、懒加载 四、数据缓存 五、减少重绘和回流 …...

    2024/5/6 13:05:55
  4. 【虚幻引擎】C++ slate全流程开发教程

    本套课程介绍了使用我们的虚幻C去开发我们的编辑器&#xff0c;扩展我们的编辑器&#xff0c;设置我们自定义样式&#xff0c;Slate架构设计&#xff0c;自定义我们的编辑器样式&#xff0c;从基础的Slate控件到我们的布局&#xff0c;一步步的讲解我们的的Slate基础知识&#…...

    2024/5/6 9:46:04
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/6 9:21:00
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57