为什么C/C++有内存问题?

8 c c++ memory-management memo

在C/C++编程时,我已经阅读了很多程序员的说法和写作,有很多与内存有关的问题.我打算学习用C/C++编程.我对C/C++有初学者知识,我想看一些简短的示例,说明为什么C/C++会出现内存管理问题.请提供一些样品.

fma*_*ark 16

在C或C++中,有许多方法可以破坏或泄漏内存.这些错误是一些最难诊断的错误,因为它们通常不易重现.

例如,无法释放已分配的内存很简单.例如,这将执行"双重免费",尝试释放a两次并且无法释放b:

char *a = malloc(128*sizeof(char));
char *b = malloc(128*sizeof(char));
b = a;
free(a);
free(b); // will not free the pointer to the original allocated memory.
Run Code Online (Sandbox Code Playgroud)

下面是一个破坏任意内存的缓冲区溢出示例.这是一个缓冲区溢出,因为你不知道有多长str.如果它超过256个字节,那么它会将这些字节写入内存中的某些位置,可能会覆盖您的代码,可能不会.

void somefunc(char *str) {
    char buff[256];
    strcpy(buff, str);
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*rdt 7

基本上,在这些语言中,您必须手动请求不是编译时已知的本地变量的每一位内存,并且当您不再需要它时必须手动释放它.库(所谓的智能指针)可以在某种程度上自动化这个过程,但它们并不适用于所有地方.此外,对于如何(尝试)通过指针算术访问内存绝对没有限制.

手动内存管理可能会导致许多错误:

  • 如果忘记释放一些内存,则会出现内存泄漏
  • 如果您使用的内存超过了为给定指针请求的内存,则会出现缓冲区溢出.
  • 如果你释放内存并继续使用"悬空指针",你有未定义的行为(通常程序崩溃)
  • 如果您错误地计算了指针算术,则会发生崩溃或数据损坏

其中许多问题很难诊断和调试.


fre*_*low 5

我打算学习用C/C++编程

你到底是什么意思?你想学习用C语言编程,还是想学习用C++编程?我不建议一次学习这两种语言.

从用户的角度来看,C++中的内存管理比在C中容易得多,因为大多数内容都是由类封装的std::vector<T>.从概念的角度来看,C的内存管理可以说得更简单.基本上,只有mallocfree:)


小智 5

老实说我用C++编程时没有内存分配的"问题".我最近一次内存泄漏是在十多年前,而且是由于我的盲目愚蠢.如果使用RAII,标准库容器和一小部分常识编写代码,问题确实不存在.