【C++98 智能指针1 auto_ptr的原理及代码案例】已弃用!!

2024-06-19 03:12

本文主要是介绍【C++98 智能指针1 auto_ptr的原理及代码案例】已弃用!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

std::auto_ptr 是 C++98 引入的一个简单的独占所有权智能指针,但在 C++11 中已经被弃用(deprecated),并在 C++17 中被移除。这是因为 std::auto_ptr 在所有权转移时的行为(特别是通过赋值和复制操作)可能导致意外的结果和难以调试的问题。

原理

std::auto_ptr 的原理是基于独占所有权的模型。它管理一个指向动态分配对象的指针,并在 auto_ptr 对象销毁时自动删除该对象。然而,与 std::unique_ptr 不同的是,std::auto_ptr 在赋值时会自动转移所有权,即将旧 auto_ptr 的指针设置为 nullptr,并将新指针的所有权转移给左侧的 auto_ptr。这种语义可能导致意外的副作用,特别是当多个 auto_ptr 指向同一个对象时。

代码案例(注意:不推荐使用)

以下是一个使用 std::auto_ptr 的简单示例(注意,这个示例仅用于演示 auto_ptr 的基本用法,不推荐在实际代码中使用):

#include <iostream>  
#include <memory> // 包含 auto_ptr 的头文件(仅在 C++98/03 中有效)  class MyClass {  
public:  MyClass(int value) : value_(value) {}  ~MyClass() { std::cout << "MyClass destroyed with value: " << value_ << std::endl; }  void print() const { std::cout << "MyClass value: " << value_ << std::endl; }  private:  int value_;  
};  int main() {  std::auto_ptr<MyClass> ptr1(new MyClass(10)); // 分配并初始化  ptr1->print(); // 输出:MyClass value: 10  // 所有权转移给 ptr2,ptr1 现在指向 nullptr  std::auto_ptr<MyClass> ptr2 = ptr1; // 注意这里会改变 ptr1 的值  ptr2->print(); // 输出:MyClass value: 10  // ptr1 现在是 nullptr,不能通过它访问 MyClass 对象  // ptr1->print(); // 这会导致运行时错误  // 当 ptr2 离开作用域时,MyClass 对象会被自动删除  // 输出:MyClass destroyed with value: 10  return 0;  
}

替代方案

由于 std::auto_ptr 的问题,推荐使用 std::unique_ptr 来代替它。std::unique_ptr 提供了更明确和安全的所有权语义,并且支持自定义删除器,从而提供了更大的灵活性。

例如,上面的代码可以改写为使用 std::unique_ptr:
#include <iostream>  
#include <memory> // 包含 unique_ptr 的头文件  // ...(类定义保持不变)...  int main() {  std::unique_ptr<MyClass> ptr1(new MyClass(10)); // 分配并初始化  ptr1->print(); // 输出:MyClass value: 10  // 注意:不能直接将 ptr1 赋值给另一个 unique_ptr,因为 unique_ptr 不支持复制构造和赋值操作  // 正确的做法是使用 std::move 来转移所有权  std::unique_ptr<MyClass> ptr2 = std::move(ptr1); // 转移所有权给 ptr2,ptr1 现在为空  ptr2->print(); // 输出:MyClass value: 10  // ptr1 现在是空的,不能通过它访问 MyClass 对象  // ptr1->print(); // 这会导致编译时错误  // 当 ptr2 离开作用域时,MyClass 对象会被自动删除  // 输出:MyClass destroyed with value: 10  return 0;  
}

这篇关于【C++98 智能指针1 auto_ptr的原理及代码案例】已弃用!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073850

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来