假设我有很多内存将在程序的某些点分配。内存泄漏的一个重要争论是,如果在流程执行结束时操作系统将回收内存,那么占用大量内存是可以的。问题在于,即使泄漏是良性的,它仍然会占用内存。我希望我的进程一次只能“占用”大块内存。这就是我的意思:
{ // begin block
int a[some_large_number];
do_work_with_a();
} // destruct large allocation
{ // different block
int a[some_large_number];
do_work_with_a();
} // destruct large allocation
这真的有很大的不同吗?
答案 0 :(得分:3)
答案 1 :(得分:0)
首先,这里a
处于堆栈状态,所以希望some_large_number
不是太大,因为线程的堆栈大小通常以一位数兆字节来衡量。
然后第二件事,因为你担心做正确的事情:没有实际原因不要使用C风格的数组。相反,请使用std::vector
或std::array
或其他一些容器类。
第三件事,你不可能在堆栈中有任何内存泄漏。您可能有堆栈溢出,并且您可能有悬空指针指向堆栈中的内容超出范围,但内存泄漏...没有。
这样的话,拥有单独的块肯定对堆栈对象更好,特别是当它们需要重新初始化时,因为简单的堆栈分配操作非常简单,基本上只是调整堆栈指针寄存器。拥有这些小范围将允许编译器在块之间的其他事物中使用相同的堆栈空间,如果有任何代码那里。同样重要的是,它将清楚地表明这些是单独的数组,并且不会传输任何数据,这也可以启用编译器有关未初始化变量的警告(如果重新使用变量并且忘记重新初始化,则无法获得这些变量)。 / p>
但是,如果您在堆中有项目,例如您实际使用std::vector
,那么事情会有所不同。堆分配更昂贵,无论是制作还是发布,因此如果它是代码的性能关键部分,您可能宁愿重新使用已创建的std::vector
。
答案 2 :(得分:0)
没有。现代编译器已经重用了内存空间,因为int
没有析构函数。但是,调试版本是一个例外,因此您可以在调试器中研究旧的数组内容。