【发布时间】:2013-10-07 22:41:30
【问题描述】:
我从事 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 非常不同,我想避免泄漏或慢代码。非常感谢!
【问题讨论】:
-
请注意,您不必明确使用
new,有些人甚至认为这是不好的做法。智能指针结合make_shared(或make_unique)提供更多的便利和安全;对于对象数组,有std::vector和std::array。 -
int size = 10;必须是const int size = 10;或constexpr int size = 10;并且public后面缺少一个冒号。
标签: c++ memory-management