5

我一直在研究一堆图像处理程序..没什么花哨的,主要是快速而肮脏的实验。图像数据存储在堆栈上声明的向量中(当我不需要传递数据时,我尽量避免使用指针)。我注意到尽管进行了无数次的调试和单步调试,我的一些函数的行为仍然非常奇怪。有时调试器会给我一个错误,它不能评估某个变量等等。事情通常是没有意义的,过去的经验告诉我,当这种情况发生时,这意味着发生了某种溢出或内存损坏。首先想到的是,这可能是由于我将大量图像数据存储到向量中。

然而,我的印象是向量将它们的实际数据存储在堆中,所以我认为在堆栈中放置一些这样的大向量并没有什么坏处。我这样想错了吗?我应该分配我的向量并将它们存储在堆而不是堆栈中吗?

谢谢,

4

3 回答 3

7

[...]向量将它们的实际数据存储在堆中

vector与所有其他容器一样,使用分配器对象进行内存管理。通常,如果您没有指定任何内容作为模板的第二个参数,则使用默认分配器 -- std::allocatorfrom <memory>--。分配器负责保留内存。可以从自由商店或堆栈上自由地这样做。

大多数实现通常使用pimpl习惯用法并在对象中存储一个指针,该指针指向vectorfree-store 上的实际内存。

我注意到尽管进行了无数次调试和步进,但我的一些函数的行为非常奇怪

您可能需要检查您是否vector正确使用了您的 s。查看标准,了解每个成员函数获得的保证、包含的类型必须满足哪些条件以及迭代器何时失效。这应该是一个好的开始。

于 2012-06-07T01:02:00.713 回答
3

std::vector不会将其内存存储在自身内部。它从堆中分配内存(或者你的分配器从哪里得到它)。所以vector 本身是否在堆栈上是无关紧要的。

于 2012-06-07T00:58:54.423 回答
1

我愿意说 99.9% 的向量实现将所有数据存储在堆中。也许有人在那里做了一个堆栈实现,但你可能没有处理这个问题。如果发生随机的、间歇性的故障,则更有可能出现未使用指针算法检查的极端情况。无论哪种方式,如果没有您发布代码,我们就无法知道

于 2012-06-07T00:59:04.520 回答