当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ auto_ptr用法及代码示例


在 C++ 中,当 de-allocating 是指针时可能会发生内存泄漏。因此,为了确保代码免受内存泄漏和异常的影响,C++ 中引入了一种特殊的指针类别,称为智能指针。在本文中,我们将讨论自动指针(auto_ptr),它是 C++ 中的智能指针之一。

先决条件: C++中的指针,C++ 中的智能指针

Note: Auto Pointer was deprecared in C++11 and removed in C++17

C++ 中的自动指针 (auto_ptr)

auto_ptr 是一个智能指针,它管理通过 new 表达式获得的对象,并在 auto_ptr 本身被销毁时删除该对象。一旦对象被销毁,它就会de-allocates分配的内存。 auto-ptr对该对象具有所有权控制,它基于独占所有权模型,该模型表示一个内存块不能由多个相同类型的指针指向。

当使用 auto_ptr 定义对象时,它会存储指向已分配对象的指针,并确保当 auto_ptr 本身超出范围时,它指向的内存也会被销毁。

auto_ptr 的语法

C++中的自动指针定义为:

auto_ptr <type> pointer_name = value;

为什么我们需要auto_ptr?

使用auto_ptr的目的是防止由于使用原始指针而导致代码中的资源或内存泄漏和异常。让我们看一个内存泄漏的例子。考虑以下代码:

C++


void memLeak() { 
  classA *ptr = new classA(); 
  // some code 
    
  delete ptr; 
}

在上面的代码中,我们使用delete来释放内存以避免内存泄漏。但是如果在到达删除语句之前发生异常怎么办?在这种情况下,内存不会被释放。因此,需要一个指针,可以在指针本身被销毁后释放它所指向的内存。

上面的例子可以使用auto_ptr重写为:

C++


void memLeakPrevented() { 
  auto_ptr<classA> ptr(new classA()); 
  // some code 
}

使用auto_ptr 时不再需要删除语句。

Note: The arithmetic functions on pointers are not valid for auto_ptr such as increment & decrement operators.

C++ 中的 auto_ptr 示例

C++


// C++ program to illustrate the use of auto_ptr 
#include <iostream> 
#include <memory> 
  
using namespace std; 
  
// creating class with overloaded constructor and destructor 
class Integer { 
public: 
    Integer() { cout << "Object Created" << endl; } 
  
    ~Integer() { cout << "Object Destroyed" << endl; } 
}; 
  
// driver code 
int main() 
{ 
    // creating auto pointer to Integar class 
    auto_ptr<Integer> ptr(new Integer()); 
  
    // not using delete 
  
    return 0; 
}
输出
Object Created
Object Destroyed

在此示例中,我们创建了一个 auto_ptr 对象 ptr 并使用指向动态分配的 Integer 对象的指针对其进行初始化。

由于ptr是main()中的局部自动变量,因此当main()终止时ptr被销毁。 auto_ptr 析构函数强制删除 ptr 指向的 Integer 对象,该对象又调用 Integer 类析构函数。 Integer 占用的内存被释放。当auto_ptr对象的析构函数被调用时,Integer对象将被自动删除。

为什么auto_ptr被删除?

auto_ptr 在 C++ 11 中被折旧,并在 C++ 17 中被删除。删除 auto_ptr 是由于以下限制:

  1. 一个auto_ptr不能用于指向数组。在删除指向数组的指针时,我们需要使用删除[]但在auto_ptr我们只能使用删除.
  2. 一个auto_ptr不能与 STL 容器一起使用,因为容器或操作它们的算法可能会复制存储的元素。 auto_ptrs 的副本不相等,因为原始设置为NULL被复制后。
  3. auto_ptr 不适合移动语义,因为它们通过使用复制操作来实现移动。

由于上述限制,auto_ptr 从 C++ 中删除,后来替换为 unique_ptr



相关用法


注:本文由纯净天空筛选整理自nikhilsharma9060大神的英文原创作品 auto_ptr in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。