当前位置:首页 > 内存 > 正文

c语言内存泄露

  • 内存
  • 2024-08-07 17:26:17
  • 9209

一、为什么C语言中的DebugAssertionFailed会出错?

关于C语言中的DebugAssertionFailed,编译和执行时不会出错,但执行时会出错。出现此错误的可能原因有:

1直接释放空指针

2)。

以下面的简单程序源码为例:

程序运行时出现错误警告框“DebugAssertionFailed”这这种情况主要是由指针引起的错误造成的。

下图中红框标注的位置是Distance类的析构函数,这里就是使用delete的地方。这里其实没有必要,因为pDist指针是在程序执行完毕时静态分配的,此时它的内存被释放,使用了不存在的指针,从而报错其实delete是和new一起使用的。

扩展信息:

除了导致“DebugAssertionFailed”错误的指针之外,数组越界也会导致内存泄漏等错误。

内存泄漏(即MemoryLeak)是指程序中动态分配的内存没有被释放或者由于某种原因无法释放,导致系统内存泄漏,导致程序变慢甚至系统崩溃。

无论是C还是C++程序,运行时分配变量的方式主要有三种:堆分配、栈分配、全局和静态内存分配。内存泄漏主要发生在堆内存分配方式中,即“内存配置完成后,所有指向该内存的指针都丢失了”。

如果没有像语言这样的垃圾回收机制,这样的内存块就无法返回给系统。由于内存泄漏是运行时问题,无法通过编译来识别,只能在程序执行过程中识别和诊断。

参考来源:-内存泄漏


二、c语言中string重新赋值会不会出现内存泄露?不会出现内存泄漏;
“sfdfsa”和“fwinfg”都是字符串常量,既不驻留在栈上,也不驻留在堆上。在C/C++语言中,常量被分配在固定的存储区域(数据段)中,并由系统控制。因为不涉及堆/动态内存,所以不存在所谓的内存泄漏问题。
C语言是一种应用广泛的通用计算机编程语言。C语言的设计目标是提供一种可以轻松编译、处理低级内存、生成少量机器代码、并且可以在没有任何运行时环境支持的情况下运行的编程语言。