C++常见的内存泄漏有哪些
一、未释放动态分配的内存
C++中,动态分配内存的方法有 new 和 malloc,使用它们分配的内存必须在使用完之后通过 delete 和 free 进行释放,否则会造成内存泄漏。比如:
int *p = new int[10];
for (int i = 0; i < 10; ++i)
{
p[i] = i;
}
// ...
// 忘记释放p
在上面的例子中,我们忘记了释放 p,这会导致 10 个 int 类型的内存泄漏。
二、未释放栈分配的内存
C++中,栈分配的内存是由编译器自动管理的,但是有时候,我们会在栈中分配一块内存,将它的地址传递给别的函数,而在别的函数中,我们可能会忘记使用完之后释放这块内存,这也会造成内存泄漏。比如:
int *p = (int *)malloc(sizeof(int) * 10);
for (int i = 0; i < 10; ++i)
{
p[i] = i;
}
foo(p); // 传递给别的函数
// ...
// 忘记释放p
上面的例子中,我们将 p 传递给了另一个函数 foo,但是在函数 foo 中,我们可能会忘记释放 p,这也会导致内存泄漏。
三、循环引用
C++中,有时候会出现循环引用的情况,比如两个对象互相持有对方的引用,这样就会导致这两个对象都无法被释放,从而导致内存泄漏。比如:
class A
{
public:
B *b;
};
class B
{
public:
A *a;
};
int main()
{
A *a = new A;
B *b = new B;
a->b = b;
b->a = a;
// ...
// 忘记释放a和b
return 0;
}
上面的例子中,A 和 B 互相持有对方的引用,因此 a 和 b 都无法被释放,这样就会造成内存泄漏。
猜您想看
-
如何理解weed3-4.1开始注解sql的使用
h4 步骤一:...
2023年07月04日 -
如何在宝塔面板中恢复MySQL数据库?
如何在宝塔面板...
2023年04月16日 -
Hadoop 与 MPPDB 的区别是什么
1. Hado...
2023年07月23日 -
Spring Boot devtool的使用方法
1、Sprin...
2023年05月22日 -
为什么我的苹果手机无法正常使用WeChat?
苹果手机WeC...
2023年04月27日 -
如何制作Cubie版OpenWRT
1. 准备工作...
2023年07月23日