我有多年的 Java 开发经验,现在我想切换到 C++,我很难理解内存管理系统。
让我用一个小例子来解释一下情况:
据我了解,您可以在堆栈或堆上分配空间。第一个是通过像这样声明一个变量来完成的:
int a[5]
或者
int size = 10;
int a[size]
相反,如果你想在堆上分配内存,那么你可以使用“new”命令来完成。例如像:
int *a = new int[10]; (notice that I haven't tried all the code, so the syntax might be wrong)
两者之间的一个区别是,如果它在函数完成时分配到堆栈上,那么空间会自动释放,而在另一种情况下,我们必须使用 delete() 显式释放它。
现在,假设我有这样的课程:
class A {
const int *elements[10];
public void method(const int** elements) {
int subarray[10];
//do something
elements[0] = subarray;
}
}
现在,我有几个问题:
- 在这种情况下,子数组被分配在堆栈上。为什么函数方法完成后,如果我查看 elements[0] 仍然可以看到子数组的数据?编译器是否翻译了堆分配中的第一个分配(在这种情况下,这是一个好习惯)?
- 如果我将子数组声明为“const”,那么编译器不会让我将它分配给元素。为什么不?我认为 const 只涉及无法更改指针,而没有别的。
- (这可能很愚蠢)假设我想分配的“元素”不是固定的 10 个元素,而是来自构造函数的参数。是否仍然可以在堆栈中分配它,或者构造函数将它始终分配在堆中?
抱歉这些问题(对于专业的 C 程序员来说可能看起来很傻),但是 C++ 的内存管理系统与 Java 非常不同,我想避免泄漏或代码缓慢。提前谢谢了!