简单的记忆问题练习
Simple memory issue exercise
我主要从事高级编程语言的工作,但所以昨天一个朋友让我帮他解决一个简单的C++练习,当我在做的时候,我写了一段代码:
for (int x = 0; x < 10; x++){
int a, b, c;
a = x;
b = x*2;
c = x+5;
}
我的问题是:这会导致内存泄漏,使a、b、c总是在内存的不同位置创建,还是总是被每个循环覆盖?
只有在动态分配变量的情况下(通过调用new
或new []
、malloc
或calloc
(,才会发生内存泄漏。您的代码中没有,所以没有。
您所拥有的是本地或自动变量。正如名称所说,当创建自动变量的作用域{}
结束时,自动变量会隐式解除分配。
a
、b
和c
将在堆栈上分配。除非类型本身通过其构造函数和/或析构函数导致内存泄漏,否则自动变量永远不会导致内存泄漏。
关于它们是否会覆盖每个循环的问题:我强烈怀疑地球上的每个编译器都会这样做,但原则上,这并不能保证。如果查看汇编输出,您会发现(a(所有变量都在寄存器中,或者(b(它们作为堆栈指针的固定偏移量检索。由于每次在循环中都执行相同的程序集,因此它们确实会被覆盖。
您会问三个问题:
这将导致内存泄漏
不,这里没有内存泄漏。正如该术语通常使用的那样,存储器泄漏需要没有delete
的new
、没有delete[]
的new[]
或没有free()
的malloc()
。
a、b、c总是在内存的不同位置创建
它们可能是。它们可能不是。这是一个你的程序不需要知道的实现细节。您所需要知道的是,对象是在定义它们的行处创建的,并在该范围的右大括号处销毁。
每次循环都会覆盖它们
它们可能是。它们可能不是。这是您的程序不需要知道的实现细节。无论它们是否被覆盖,每次循环时都会被销毁。
在循环的每次迭代中,内存中的相同位置将用于存储a
、b
和c
中的值。
如果您创建一个类似的变量
int i = 5;
编译器会把它们放在堆栈上,你不必释放int。但是,如果在堆上创建int,
int* i = new int; /*C++ style*/
int* j= (int*) malloc(sizeof(int)); /*C style*/
你必须这样释放内存:
delete i; /*C++ style*/
free(j); /*C style*/
否则你会有内存泄漏。最重要的是,您不希望混合使用c和c++风格的内存处理。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 加速C++练习2.4
- 编译包含字符串的代码时遇到问题
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 尺寸数组 [矩阵] 练习的问题
- 循环练习时的问题
- 我正在尝试[C++]练习多态性和OOD原则。需要指导和几个问题的答案
- C++练习车辆程序问题 - 初学者编程
- 跳到C++第13章练习问题4-指针
- 在linux下练习编程的问题
- 练习的问题
- 跑步练习2-4的问题,来自学习Opencv,O'Reilly
- 简单的记忆问题练习
- 模板练习问题
- 按顺序显示字符串-练习问题