我看到很多程序员在编写C/C++代码的时候都会提到与内存相关的问题。我计划学习C/C++编程,我对C/C++有一些初步的了解,但我想看一些简短的示例来了解C/C++为什么会存在内存管理方面的问题。请提供一些示例。
我看到很多程序员在编写C/C++代码的时候都会提到与内存相关的问题。我计划学习C/C++编程,我对C/C++有一些初步的了解,但我想看一些简短的示例来了解C/C++为什么会存在内存管理方面的问题。请提供一些示例。
在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.
下面是一个导致任意内存损坏的缓冲区溢出示例。它是一种缓冲区溢出,因为你不知道 str
的长度。如果它长于 256 字节,那么它将在内存中某个地方写入这些字节,可能会覆盖你的代码,也可能不会。
void somefunc(char *str) {
char buff[256];
strcpy(buff, str);
}
b
指针的问题是首先重构了一个设计不良的系统所导致的结果。这个问题可以很容易地通过auto
或register
临时变量来解决,这就是为什么内联函数可以通过参数化来解决这个问题的原因。全局内存需要全局管理。 - AMDG在C和C++中,常见的内存管理问题之一与数组缺乏边界检查有关。与Java(例如)不同,C和C++不会检查数组索引是否落在实际数组边界内。因此,很容易意外地覆盖内存。例如(C++):
char *a = new char[10];
a[12] = 'x';
以上代码不会出现编译或运行时错误,但您的代码将覆盖不应该被覆盖的内存。
这个原因通常被认为是C/C++与许多现代语言不同的地方,因为许多现代语言执行内存管理和垃圾回收。在C/C++中,情况并非如此(好或坏)。您需要手动分配和释放内存,如果操作不正确,会导致内存泄漏,在执行内存管理的语言中是不可能出现的。
boost::shared_ptr<T>
。 - fredoverflowstruct student
{
char name[20];
int roll;
float marks;
}s[100];
我假设班级里有100名学生。学生人数可能多于100或少于100。如果超过100,则您的程序将丢失信息;如果少于100,则程序将运行但会浪费内存,这可能很大。
因此,我们通常在执行时动态创建记录,就像这样:
struct student *s;
s=(struct student *)malloc(sizeof(struct student));
scanf("%s %d %f",s->name,s->roll,s->marks);
如果不使用,则从内存空间中删除它。
free(s);
这是编程中的良好习惯,如果不从内存中删除,则可能会在某个时候填满内存堆栈并导致系统挂起。
许多“现代C ++”(据说C ++可以视为多种语言,具体取决于您如何使用它)与使用类的c(或x和y C ++功能)相反,经常使用简单的可选gc /自动内存管理来进行妥协(请注意,可选gc在内存管理方面可能比强制性更差,因为当其强制时,它是一个更简单的系统),以及一些手动内存管理。根据您的做法,使用gc和手动内存管理可能具有一些优点和缺点。可选GC也可用于某些C库,但在C中不太常见。