首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在标准容器中使用std :: auto_ptr <>是错误的?

在标准容器中使用 std::auto_ptr<> 是错误的,原因有以下几点:

  1. std::auto_ptr<> 在 C++11 版本中被引入,目的是为了解决 std::unique_ptr<> 引入之前使用原始智能指针时存在的问题,如需要指定复制构造函数和移动赋值运算符以及拷贝删除等操作。std::auto_ptr<> 使用显式删除操作符,可以在对象的生命周期结束时自动释放内存,从而避免了内存泄漏问题的发生。
  2. std::auto_ptr<> 只能在局部作用域中声明和定义智能指针。当智能指针被声明在全局作用域或者多个函数作用域中时,使用 std::auto_ptr<> 会导致代码在多个作用域中重复声明同一个智能指针实例,这会导致对象实例的复制,从而浪费内存空间。
  3. 在标准容器中使用 std::auto_ptr<> 会导致对象的拷贝行为,从而影响容器中的统计信息,如对象数量、大小等统计信息。这不仅会影响容器的性能,也会给程序的可维护性和可读性带来问题。

为了解决这些问题,建议使用智能指针家族的新成员 std::unique_ptr<>。std::unique_ptr<> 提供了一个智能指针对象只会被创建一次的能力,并且在删除智能指针对象之后,被指向的对象会自动被删除。同时,std::unique_ptr<> 提供了一个指针运算符重载功能,可以更方便地进行对象的拷贝、移动和赋值操作。对于需要在容器中使用智能指针的场景,建议使用 std::unique_ptr<> 而不是 std::auto_ptr<>。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Lxcfs容器集群使用

背景:我们知道k8s pod 内,使用top/free/df等命令,展示状态信息从/proc目录相关文件里读取出来,这些文件默认读取pod所在节点主机对应文件数据。...需求:pod 内执行top/free/df等命令时候,获取到pod 纬度状态数据,而不是整个宿主机状态。...LXCFS:FUSE filesystem for LXC 一个常驻服务,它启动以后会在指定目录自行维护与上面列出/proc目录文件同名文件,容器从lxcfs维护/proc文件读取数据时...,得到容器状态数据,而不是整个宿主机状态。...image.png 概述 本文介绍了如何在TKE集群中使用lxcfs admission webhook方案来启用lxcfs支持(Initializers特性K8s 1.14废弃,不再推荐使用原来initializer

2.7K20

C++|智能指针模板类

其中,auto_ptrC++98提供新版C++11已经被摒弃,但为了对比理解,这里还会提到auto_ptr指针。...; //#3 #3,p2接管了p1所有权后,p1所有权将被剥夺,这代表着如果p1再次被使用,则会导致程序发生错误,因为此时p1...很多STL容器算法都支持复制和赋值操作,这些操作可以用于shared_ptr,但不能用其他两个。 如果程序不需要使用多个指向同一个对象指针,则可以使用unique_ptr。...注意: 如果容器算法试图对包含unique_ptr容器指向类似于#1操作,这将会导致编译错误!...如果实在需要这种赋值操作,安全重用这种指针,可以给他赋新值,这就引出了另外一个标准函数库函数:std::move()通过它,你可以实现将unique_ptr赋值给另外一个。

62910
  • 详解 C++ 11 智能指针

    C++ 98/03 尝试——std::auto_ptr 2019 年讨论 std::auto_ptr 不免有点让人怀疑是不是有点过时了,确实如此,随着 C++11 标准出现(最新标准是 C++20...由于 std::auto_ptr 这种不常用复制语义,我们应该避免 stl 容器使用 std::auto_ptr,例如我们绝不应该写出如下代码: std::vector> myvectors; 当用算法对容器操作时候(如最常见容器元素遍历),很难避免不对容器元素实现赋值传递,这样便会使容器多个元素被置为空指针,这不是我们想看到,会造成很多意想不到错误...正因为存在上述设计上缺陷, C++11及后续语言规范 std::auto_ptr 已经被废弃,你代码不应该再使用它。...C++ 新标准各种智能指针如此实用与强大,现代 C++ 项目开发,读者应该尽量去使用它们。

    2.8K31

    C++智能指针学习(一)

    编译结果: 从警告deprecated 单词表明这个std::auto_ptr已经标准中被抛弃了。...由于 std::auto_ptr 这种不常用复制语义,我们应该避免 stl 容器使用 std::auto_ptr,例如我们绝不应该写出如下代码: std::vector> myvectors; 当用算法对容器操作时候(如最常见容器元素遍历),很难避免不对容器元素实现赋值传递,这样便会使容器多个元素被置为空指针,这不是我们想看到,会造成很多意想不到错误...正因为 std::auto_ptr 设计存在如此重大缺陷,C++11 标准充分借鉴和吸收了 boost 库智能指针设计思想,引入了三种类型智能指针,即:std::unique_ptr、std:...所以 C++11及后续语言规范 std::auto_ptr 已经被废弃,你代码不应该再使用它。

    75620

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

    比如说int,C++内置类型都是值语义,前面学过三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下对象 对象拷贝禁止(Noncopyable)...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象构造函数执行资源获取(指针初始化),析构函数释放(delete 指针)。...对auto_ptr 做一点小结: 1、auto_ptr不能作为STL容器元素 2、STL容器要求存放在容器元素值语义,要求元素能够被拷贝。...实际上auto_ptr 值语义(将对象语义转换为值语义),auto_ptr 之所以不能作为STL容器元素,关键在于第3点,即 auto_ptr拷贝构造或者赋值操作会改变右操作数,如下代码: std...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身内存释放,并不负责指针指向内存释放,假设一 个MultipleNode 类有成员vector vec_; 那么析构函数需要遍历容器

    1.8K00

    C++ 为什么不加入垃圾回收机制

    那么就仅剩下一个问题了,如果对象本身自由存储区(Free Store,也就是所谓“堆”)动态创建,并由指针管理(相信你已经知道为什么了),则还是必须通过编码显式调用析构函数,当然借助指针...智能指针 幸运,出于某些原因,C++标准至少引入了一种类型智能指针,虽然使用上有局限性,但是它刚好可以解决我们这个难题,这就是标准唯一一个智能指针::std::auto_ptr。...标准容器 对于需要在程序拥有相同类型多个对象,善用标准库提供各种容器类,可以最大限度杜绝显式内存管理,然而标准容器并不适用于储存指针,这样对于多态性支持仍然面临困境。...使用智能指针作为容器元素类型,然而标准容器和算法大多数需要值复制语义元素,前面介绍转移所有权auto_ptr和自制共享对象shared_ptr都不能提供正确值复制语义,Herb Sutter...《More Execptional C++》设计了一个具有完全复制语义智能指针ValuePtr,解决了指针用于标准容器问题。

    90330

    什么线程组,为什么 Java 不推荐使用

    线程组使用 Java 线程进行管理和组织一种模型。...Java 线程组一个 ThreadGroup 类对象,它充当了一个父容器,可以将同一类线程分成一组,并提供追踪这些线程状态、统计信息及管理这些线程方法。...在线程组,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。 Java ,虽然线程组一种功能强大机制,但实际上并不推荐使用。...3、容易引起歧义 Java ,虽然 ThreadGroup 设计旨在通过将一组线程分到同一个容器来轻松管理和控制它们,但如果使用错误,可能会导致线程状态。...因此, Java ,线程组已基本过时,推荐使用 Executor 框架等新更实用工具来进行线程管理。

    30220

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

    比如说int,C++内置类型都是值语义,前面学过三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下对象 对象拷贝禁止(Noncopyable)...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象构造函数执行资源获取(指针初始化),析构函数释放(delete 指针)。...对auto_ptr 做一点小结: 1、auto_ptr不能作为STL容器元素 2、STL容器要求存放在容器元素值语义,要求元素能够被拷贝。...实际上auto_ptr 值语义(将对象语义转换为值语义),auto_ptr 之所以不能作为STL容器元素,关键在于第3点,即 auto_ptr拷贝构造或者赋值操作会改变右操作数,如下代码: std...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身内存释放,并不负责指针指向内存释放,假设一 个MultipleNode 类有成员vector vec_; 那么析构函数需要遍历容器

    68910

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)

    比如说int,C++内置类型都是值语义,前面学过三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下对象 对象拷贝禁止(Noncopyable)...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象构造函数执行资源获取(指针初始化),析构函数释放(delete 指针)。...对auto_ptr 做一点小结: 1、auto_ptr不能作为STL容器元素 2、STL容器要求存放在容器元素值语义,要求元素能够被拷贝。...实际上auto_ptr 值语义(将对象语义转换为值语义),auto_ptr 之所以不能作为STL容器元素,关键在于第3点,即 auto_ptr拷贝构造或者赋值操作会改变右操作数,如下代码: std...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身内存释放,并不负责指针指向内存释放,假设一 个MultipleNode 类有成员vector vec_; 那么析构函数需要遍历容器

    1.1K20

    什么智能指针

    还有一个例子,Java 容器中放对象,实际放入引用,不是真正对象,而 C++ vector push_back 采用值拷贝。...如果想实现 Java 引用语义,就应该使用智能指针,可以参考《C++ 标准库程序》(侯捷/孟岩 译)第五章讲容器部分,有一节叫做 “用 Value 语义实现 Reference 语义”,还有陈硕那本...C++ 标准一共有四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中 auto_ptr C++11 已被摒弃,C++17 中被移除不可用了。...auto_ptr auto_ptr 可以实现对象 RAII,那为什么 C++17 里要摒弃呢?...可以将 unique_ptr 存储到 STL 容器,只要不调用将一个 unique_ptr 复制或赋给另一个算法(如 sort())。例如,可在程序中使用类似于下面的代码段。

    62920

    为什么StringJava不可变

    String Java 不可变。 不可变类只是一个无法修改其实例类。 创建实例时,将初始化实例所有信息,并且无法修改信息。 不可变类有许多优点。...本文总结了为什么 String 设计为不可变。 这篇文章从内存,同步和数据结构角度说明了不变性概念。 1. 字符串池 字符串池(String intern pool)方法区域中特殊存储区域。...如果字符串可变,则使用一个引用更改字符串将导致其他引用错误。 2. 缓存哈希码 字符串哈希码经常在 Java 中使用。 例如, HashMap 或 HashSet 。...(new String("b")); set.add(new String("c")); for(String a: set) a.value = "a"; 在此示例,如果 String 可变...字符串不是不可变,连接或文件将被更改,这可能会导致严重安全威胁。 该方法认为它连接到一台机器,但事实并非如此。 可变字符串也可能在 Reflection 引起安全问题,因为参数字符串。

    1.3K20

    使用 SpringMVC 时,Spring 容器如何与 Servlet 容器进行交互

    最近都在看小马哥 Spring 视频教程,通过这个视频去系统梳理一下 Spring 相关知识点,就在一个晚上,躺床上看着视频快睡着时候,突然想到当我们使用 SpringMVC 时,Spring...容器如何与 Servlet 容器进行交互?...以上 Spring 容器初始化逻辑,其中,CONFIG_LOCATION_PARAM 即是我们 xml 配置 contextConfigLocation 参数: ?...将 Spring 容器初始化最后以一个元素形式保存到 Servlet 容器之后,那么 SpringMVC 初始化时,如何拿到 Spring 容器呢?...DispatcherServlet 父类同样有一个方法,该方法加载 SpringMVC 容器,即源码 webApplicationContext: ?

    2.8K20

    C++智能指针

    C++智能指针 为什么使用智能指针? > p400 虽然使用动态内存有时必要,但众所周知,正确地管理动态内存是非常棘手。... STL 容器使用auto_ptr存在重大风险,因为容器元素必需支持可复制(copy constructable)和可赋值(assignable)。 不支持对象数组操作。...auto_ptrp1; p1.reset(str); }//访问越界 弊端2. STL 容器使用auto_ptr存在重大风险 vector...>va; auto_ptrp1(new string("我p1")); auto_ptrp2(new string("我p2")); va.push_back(std...std::move。把右值转换为左值。 保存指向某个对象指针,当它本身离开作用域时会自动释放它指向对象。 容器中保存指针安全。不支持直接复制v[0] = v[1]不行。

    44620

    STL容器线程安全性了解多少?

    删除输入和输出 6 你可以或不可以使用自定义分配器 7 达到做高效率技巧和考虑多线程环境下容器使用 条款1:仔细选择你容器 1,标准STL序列容器:vector, string , deue...,所以它提供封装词法,不像#define预编译阶段替换,typedef并不能阻止用户使用任何它们不应该用,如果你不想暴漏出 * 用户对你所决定使用容器类型,需要class * * 比如...list)都有效,完全替代一个容器内容 //为什么区间成员函数优先于它们单元素替代品 //区间成员函数一个像 STL 算法成员函数,使用两个迭代器参数来指定元素一个区间来进行某个操作 //...//看似合理,但结果却是错:因为排序过程widgets一个或多个auto_ptr可能已经被设为NULL //为什么会这样?...* 1.1 如果容器 vector string 或 deque, 使用 erase-remove * 1.2 如果容器 list 使用 list::remove * 1.3 如果容器标准关联容器

    1.5K10

    指针艺术——四种智能指针

    C++标准库提供了几种常用智能指针类型:auto_ptr(C 11 已弃用)、std:: unique_ptr、std::shared_ptr和std:: weak_ptr。...std::auto_ptr (C 11 已弃用) std::auto_ptr C++98标准引入一种智能指针,但在C++11被弃用,并在C++17被完全移除。...不安全:由于所有权转移特性,std::auto_ptr 不适合用于标准容器(如 std::vector),因为容器复制和赋值操作会导致所有权不确定性,可能会导致程序内存奔溃。...替代方案使用 std::unique_ptr ,std::unique_ptr 提供了更明确所有权语义,并且支持移动语义,避免了 std::auto_ptr 缺陷。...实际应用,我们应当根据具体场景需求,去选择合适智能指针类型。

    11610

    智能指针探究

    auto_ptr:C++库里面的 C++11新标准:scoped_ptr和unique_ptr 首先说auto_ptr auto_ptr p1(new int); auto_ptr...auto_ptr 经常会被问到能不能再容器当中使用auto_ptr,其实尽量别搞 vector> vec1; vec2(vec1); 因为容器使用过程,难免会用到容器拷贝构造或者容器赋值...,而这样的话,会影响容器内每个元素拷贝赋值 当你用vec1构造vec2时候,那就说明vec1里面的指针,全部为空,当你不知道这个情况下,你使用vec1里面的智能指针,就全部都是空指针了 既然auto_ptr...这就是为什么调用delete mptr;来删除指向对象 需要注意,这段代码并不会调用指向对象析构函数。析构函数delete mptr;这一行被调用时自动调用。...删除器一个函数对象,用于智能指针销毁时释放其所指向资源 在这段代码,删除器一个 lambda 表达式。lambda 表达式一种匿名函数,它可以捕获上下文中变量并在其函数体中使用

    8610

    C++基础 智能指针

    于是我们就想:如果Test *t不是一个普通指针变量,而是一个类对象的话,并且析构函数实现了释放动态内存步骤,那么只要该指针变量一退出作用域时就会调用析构函数,达到了释放动态内存目的。...如果将上述代码auto_ptr换为unique_ptr,程序编译时就会提示错误,因而它可以在编译时将潜在错误暴露出来: error C2280: 'std::unique_ptr<int,std...选择使用参考 如果程序使用多个指向同一个对象指针,那么应该使用shared_ptr 比如说现在有一个包含指针STL容器,现在用某个支持复制和赋值操作STL算法去操作该容器指针元素,那么就应该用...如果程序不需要使用多个指向同一个对象指针,则可使用unique_ptr 如果函数使用new分配内存,并返回指向该内存指针,将其返回类型声明为unique_ptr不错选择。...使用环境不支持C++11时,使用auto_ptr weak_ptr可以避免auto_ptr递归依赖关系 参考: https://mp.weixin.qq.com/s/fM9fM1UhLhFWHJyKhFyhrg

    62020

    C++智能指针

    第4条可选功能,拥有第四条不同功能对应着不同类型智能指针,比如C++11STL引入shared_ptr就实现了引用计数功能,已经被C++11摒弃auto_ptr[4]^{[4]}实现了赋值即释放对象拥有权限...与u_s2.reset()等价 6.2为什么要摒弃auto_ptr[3]^{[3]} unique_ptr 虽然拥有auto_ptr全部功能,但是为什么摒弃auto_ptr。...(3)扩展auto_ptr不能完成功能 (3.1)unique_ptr可放在容器,弥补了auto_ptr不能作为容器元素缺点。...掌握了上面提到C++ STL四种智能指针后,大家可能会想另一个问题:实际应用,应使用哪种智能指针呢? 下面给出几个使用指南。...满足unique_ptr要求条件时,也可使用auto_ptr,但unique_ptr更好选择。

    3.5K30

    浅谈Linux SECCOMP安全机制容器使用

    过滤模式通过使用Berkeley数据包过滤器做过滤规则匹配,也就是这里BPF。...如图,阻断了59号系统调用(64位 Linux对应execve系统接口),并返回指定错误码。...但是如果需要大批量配置多个 相同容器,seccomp就相对来说容易得多;定义好一份seccomp配置文件,多个容器加载时候,指定该份配置文件就可以省掉单个容器配置。...seccomp使用 容器 seccomp使用,本质对Seccomp-BPF再封装使用;通过简单配置文件来达快速设置多个容器seccomp安全应用(以下全部以docker为例)。...seccomp做为容器中最后一道安全防御机制, 本质对seccomp-BPF再封闭使用,来达到最小权限来运行Docker容器,而从避免恶意软件对容器本身越权行为,把恶意行为限制到容器内, 避免扩散

    6.8K21
    领券