C++ Exceptional 有关auto_ptr使用需要注意的地方

auto_ptr是C++11之前标准库里带的一个通用的智能指针,但说实话很多人可能并不喜欢用这个东西,因为它有时会带来一些意想不到的bug,而正是auto_ptr的实现方式才导致了这些问题的产生,下面我详细叙述一下这里的前因后果。

首先,作为一个智能指针对象,auto_ptr是没有引用计数的概念的,所以这就导致了一个问题:
当一个auto_ptr由另一个auto_ptr拷贝构造或者赋值的时候,这个时候,对象的所有权应该怎么办呢。首先,因为没有引用计数,所以不能通过加引用计数的方式来进行赋值或者拷贝。但如果不利用引用计数,而直接进行拷贝,那么相当于说两个auto_ptr持有相同的一个内部指针,这样的后果就是导致这个指针会被重复释放,从而引起错误。c++标准库为了避免这种错误,所以在设计auto_ptr时,是用的所有权转移的方式来实现拷贝构造和赋值构造的。这样的话,原生指针在某个时间只可能被一个auto_ptr对象所拥有,从而避免了重复释放的问题。而也正是这种实现方式,才有了下面的几个错误的使用auto_ptr的方式:

  • 不要引用已经转移所有权的auto_ptr
std::auto_ptr<T> a(new T());
std::auto_ptr<T> b = a;
a->func() or *a 等等

这种的错误根源在于把a对对象T的所有权转移给b后,又去使用a对象去访问原生指针,这样肯定是会出错的,因为a对象中的原生指针已经是null了

  • 不要把auto_ptr放入标准容器中
vector<auto_ptr<T>> v;

切记,auto_ptr是不能放置在标准容器里的,这也是由于auto_ptr的特性决定的。因为标准容器里的对象要满足一个要求,那就是对象之间是互等的复制,也就是说,对象复制后这两个对象是完全相等的。而auto_ptr显然不能满足这个要求,因为auto_ptr在复制的过程中伴随着原生指针所有权的转移。

  • auto_ptr作为类的成员变量时,注意类的拷贝构造和赋值构造函数
class C
{
public: /*...*/
protected: /*...*/
private: /*...*/
    auto_ptr<CImpl> pimpl_;
}

如上,当把auto_ptr当作类的成员函数时,这个时候要特别注意类的拷贝构造函数和赋值构造函数,因为两个类之间的赋值或者拷贝,会把其中一个类的auto_ptr置空,这个时候,你要想一下,这是不是你想要的结果。

说了以上这么多,总起来说,auto_ptr存在的问题还是挺多的,这也正是大家不太喜欢用它的原因。当然boost库中或者C++11后,有了更好的替换auto_ptr的智能指针,shared_ptr和unique_ptr,大家在开发过程中可以安全地使用这两种类型的智能指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: exceptional c指的是超乎寻常的C语言,即在使用C语言进行编程时,达到了非凡的水平和能力。这包括但不限于熟练掌握C语言的语法和特性,理解C语言的底层机制和内存管理,编写高效且可靠的代码,解决复杂而困难的问题。拥有exceptional c能力的程序员通常能够编写高性能的程序,优化代码,改善资源利用效率,提高软件的质量和可维护性。 而more exceptional c则进一步指的是在exceptional c的基础上,更进一步的提升和发展。它可能包括对C语言更深层次的理解,对C语言编程范式、设计模式和最佳实践的掌握,能够设计和实现复杂的数据结构和算法,以及利用C语言的扩展功能和库实现创新的解决方案。 与exceptional c相比,more exceptional c更注重在C语言的高级特性上的应用,如面向对象的编程,泛型编程,元编程等。通过更深入的学习和研究,更出色的C程序员可以利用这些高级技术,进一步提高代码的可读性,可维护性和重用性。 总而言之,exceptional c是对熟练掌握C语言编程的基本要求,而more exceptional c则代表在此基础上进一步提升和发展,拥有更高级的技能和能力。 ### 回答2: exceptional c是指非常优秀的C语言代码,具有出色的设计和实现,能够在效率、可靠性和可读性等方面表现出色。这种代码通常具有良好的算法和数据结构选择,以及正确的错误处理机制。 而more exceptional c是指比exceptional c更加出色的C语言代码,更具有创新和突破性。它可能包含了前沿的编程技术、高级的数据结构和算法,以及更为复杂和深入的问题解决方案。这种代码可能会利用C语言的底层优势,充分发挥计算机性能并提供更高的效率。 在开发过程中,编写exceptional c代码需要遵循良好的编程习惯和规范,保持代码的可维护性和可扩展性。这种代码通常具有清晰的结构和注释,函数和变量命名规范恰当。同时,编写exceptional c代码也要注意错误处理和异常处理,确保代码的健壮性和可靠性。 而more exceptional c则需要更深入的编程知识和技巧。它可能涉及更多的底层编程,例如操作系统级别的代码或者底层硬件的访问。同时,more exceptional c还可能包含更复杂的算法和数据结构,以及高级的设计模式和架构思想。编写more exceptional c代码需要对C语言的特性和底层工作原理有深刻的理解和掌握。 总之,exceptional c和more exceptional c都是指在C语言中表现出色的代码,但more exceptional c更进一步,采用更高级的技术和解决方案,展现出更出色的能力和创新精神。 ### 回答3: exceptional c是指非常出色的c,可能是指一个人的能力或者品质在某个方面超越了常人,表现出非凡的才华或者特点。它强调了c的某种特别之处,使得它在众多同类中脱颖而出。 而more exceptional c则意味着更加出色的c,即在exceptional c的基础上进一步提升,突破了先前的界限,表现出更加突出的表现和才能。它可以指一个人在原有的基础上通过努力和不断学习进步,取得了更加卓越的成就,或者是指一个事物在原有的基础上通过创新和改进,达到了更高的水平。 总之,exceptional c和more exceptional c都表达了某种非凡和出色的意思,但more exceptional c更加强调在原有的基础上取得更高的成就和突破。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值