C++智能指针简介

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

前言

这篇文章将为大家带来智能指针,很多人都听过指针但是智能指针对于大家来说可能会很陌生。

一、C语言和C++中的动态内存申请

在C语言使用malloc进行动态内存的申请

在C++中使用new进行动态内存的申请

C语言:

  int *p = (int*)malloc(4);

C++

  int *p = new int;

在C语言和C++中使用malloc和new进行动态内存的申请,最终返回的都是指针类型。

我们申请了一段空间就必须要释放,否则就会发生内存泄漏。

在C语言和C++中分别使用free和delete进行内存的释放。

C语言:

  free(p);

C++

  delete p;

这样看起来只要遵守申请了内存就进行释放那就不会出现什么问题了。但是很多人申请内存后就会忘记释放,或者对同一块内存空间进行多次释放。这样就会导致很严重的BUG。

所以我们需要引入一个新的概念智能指针,智能指针可以自动释放申请到的内存,而且还保证不能多次释放同一块内存空间。

二、智能指针的创建

这里我们使用自定义类创建一个智能指针。

在析构函数中释放掉申请的内存,当程序结束时,动态申请的内存也就被释放了,这样就保证了内存不会被释放的问题了。

class Test
{
public:
  Test()
  {
    cout << "Test()" << endl;
  }
  ~Test()
  {
    cout << "~Test()" << endl;
  }
};
class point
{
  Test* mp;
public:
  point(Test* p = NULL)
  {
    mp = p;
  }
  point(const point& obj)
  {
    mp = obj.mp;
    const_cast<point&>(obj).mp = NULL;
  }
  point& operator = (const point& obj)
  {
    if (this != &obj)
    {
      delete mp;
      mp = obj.mp;
      const_cast<point&>(obj).mp = NULL;
    }
  }
  Test& operator * ()
  {
    return *mp;
  }
  Test* operator -> ()
  {
    return mp;
  }
  ~point()
  {
    delete mp;
  }
};
int main()
{
  point p = new Test();
  point p1(p);
  return 0;
}

这里还重载了->和*操作符保证了可以和指针一样的使用方法。

总结

智能指针使用起来是非常方便的,有了智能指针我们就可以避免动态内存申请时出现内存泄漏等问题了。大家下去多理解一下智能指针,这个在以后的工程开发当中还是很有用的,有什么地方不懂的大家可以留言或者私信。

相关文章
|
6天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
32 0
|
1月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
50 0
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
90 4
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
2月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
62 1
|
2月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
45 2
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
56 3