C++98 auto_ptr智能指针

简介: C++98 auto_ptr智能指针

auto_ptr 是C++98定义的智能指针模板,其定义了管理指针的对象,可以将new获得(直接或间接)的地址赋给这种对象.当对象过期时,其析构函数将使用delete来释放内存!

用法:

头文件: #include<memory>

用法: auto_ptr <类型> 变量名(new 类型);

#include<iostream>
#include<memory>
using namespace std;
class test {
public:
  test() {
    cout << "调用构造函数" << endl;
  }
  ~test() {
    cout << "调用析构函数" << endl;
  }
};
int main(void) {
  // 语法:
  // auto_ptr<类型> 变量名(new 类型);
   //test* t = new test();//普通用法 不能自己析构
  auto_ptr<test>t(new test());
  return 0;
}

运行结果:

get : 获取指针

// get : 获取指针
cout << t.get() << endl;
test* temp = t.get();

release : 取消智能指针对动态内存的托管,此时内存必须由程序员手动释放

auto_ptr<test>t(new test());
// release : 取消智能指针对动态内存的托管,此时内存必须由程序员手动释放
test* temp = t.release();
delete temp;

reset : 重置智能指针托管的动态内存,如果地址不一致,原来的地址会被释放

(1)无参 :释放当前对象

//test* t = new test();//普通用法 不能自己析构
auto_ptr<test>t(new test());
// reset : 重置智能指针托管的动态内存,如果地址不一致,原来的地址会被释放
t.reset();

结果:

(2)有参:释放原来的对象,重新托管新的对象

auto_ptr<test>t(new test());
// reset : 重置智能指针托管的动态内存,如果地址不一致,原来的地址会被释放
//t.reset();
t.reset(new test());

结果:

使用建议:

(1).尽可能不要将auto_ptr变量定义为全局变量或指针

(2).除非自己知道后果,不要把auto_ptr 智能指针赋值给同类型的另外一个智能指针

(3).C++11 后auto_ptr已经被"抛弃",已使用unique_ptr代替!

auto_ptr 被C++11抛弃的主要原因:

//auto_ptr 被C++11抛弃的主要原因:
  auto_ptr<string>s1(new string("ABC"));
  auto_ptr<string>s2(new string("abc"));
  cout << "s1: " << s1.get() << endl;
  cout << "s2: " << s2.get() << endl;
  cout << "s1=s2" << endl;
  s1 = s2;
  cout << "s1: " << s1.get() << endl;
  cout << "s2: " << s2.get() << endl;

将智能指针s2赋值给s1,首先s1会释放,将s2赋值给s1,同时也会s2释放

结果:

auto_ptr陷阱,不能将同一段内存交给多个智能指针同时管理!!!(适用于所有智能指针)

//auto_ptr陷阱,不能将同一段内存交给多个智能指针同时管理
  string* s = new string("智能指针的内存管理陷阱");
  {
    auto_ptr<string>s2;
    s2.reset(s);
    {
      auto_ptr<string>s1;
      s1.reset(s);
      cout << "s: " << *s1 << endl;
    }
    cout << "s: " << *s2 << endl;
  }

结果:s1和s2同时管理s,当s被s1释放后,s2将无法访问s,编译不会报错,运行时崩溃.

不建议使用auto_ptr的原因以及auto_ptr的弊端:

因此:C++11 使用了更加严谨的unique_ptr替代了auto_ptr

目录
相关文章
|
3月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
119 1
|
4月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
280 4
|
5月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
5月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
73 2
|
5月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
143 1
|
5月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
142 6
|
5月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
6月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
85 3
|
5月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
6月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。