21xrx.com
2024-12-23 01:47:32 Monday
登录
文章检索 我的文章 写文章
C++ 中的内存泄漏场景
2023-07-05 09:54:05 深夜i     --     --
C++ 内存泄漏 场景

C++ 作为一门高级语言,封装了很多底层细节,但仍然存在内存泄漏的问题。内存泄漏指在程序执行过程中,某些内存空间被申请却未被释放,导致程序占用的内存空间不断增加,最终耗尽系统的资源。下面我们将介绍 C++ 中的一些常见内存泄漏场景。

1. 动态分配内存但未释放

在 C++ 中,通过 new 操作符可以动态申请内存空间,但是如果在程序运行结束后没有经过 delete 操作释放所申请的内存空间,就会导致内存泄漏。例如:


int main() {

  int* ptr = new int[5]; // 动态申请内存

  // ... 业务逻辑代码

  // 没有释放内存

  return 0;

}

上述代码中,如果删除了注释中的一行,则会造成内存泄漏。

2. 对象的生命周期不当

在 C++ 中,对象的生命周期是非常重要的。如果对象在使用完后没有被正确地销毁,也会导致内存泄漏。例如:


int global_var = 0;

class MyObject {

public:

  MyObject() {

    global_var++;

  }

  ~MyObject()

    global_var--;

  

};

int main()

  MyObject obj; // 声明对象

  // ... 业务逻辑代码

  // 没有销毁对象

  return 0;

上述代码中,如果删除了注释中的一行,则会造成内存泄漏。因为当程序运行结束时,MyObject 的析构函数没有被调用,导致 global_var 的值不为 0。

3. 没有析构函数导致内存泄漏

对象在创建时会调用构造函数,在销毁时会调用析构函数。如果一个类没有定义析构函数,或者析构函数的实现不正确,则会导致内存泄漏。例如:


class MyObject {

public:

  MyObject() {

    data = new int[5]; // 动态申请内存

  }

  // ... 没有定义析构函数

private:

  int* data;

};

int main()

  MyObject obj; // 声明对象

  // ... 业务逻辑代码

  // 没有销毁对象

  return 0;

上述代码中,如果删除了注释中的一行,则会造成内存泄漏。因为 MyObject 类没有定义析构函数,在对象销毁时,它所持有的 data 指针指向的内存空间没有被释放。

以上是 C++ 中的一些常见内存泄漏场景,我们需要注意这些问题,在代码编写时及时进行内存的释放和销毁。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复