声明太多全局数组(或IplImages)导致问题?

时间:2013-09-16 21:56:19

标签: arrays variables opencv global iplimage

我对全局声明的数组有一般性的问题。我遇到过这个问题。我不能再同时多次运行我的应用程序,我收到一条消息(用德语):

  

die Auslagerungsdatei ist zu klein,um diesenVorgangauszuführen(翻译成这样的东西:存储文件太小而无法执行此过程)

我的问题是:这是因为太多的数组被声明为全局还是问题必须与其他东西相关,也许太多的IplImages(我已经将其中的数百个声明为全局)?我注意到一般来说阵列的大小似乎有限制。然而,声明几个总和更大尺寸的小阵列可以工作 - 或者至少达到一定的限制......因此上面的问题?我该怎么做才能避免这种情况?

编程语言:c ++,vs 2008,console app

1 个答案:

答案 0 :(得分:2)

对于您的问题,您的变量是全局变量,本地变量,类成员等并不重要。重要的事实是这些变量的寿命。如果同时加载大量图像,则可能会遇到内存问题。例如(让我使用带有cv::Mat的C ++语法而不是IplImage - 你也应该 - ):

vector<cv::Mat> images;
for(int i = 0; i < 1000000; ++i)
  images.push_back(cv::imread("image.png"));

这段代码将分配一百万个矩阵和一百万个图像。当然,这会占用大量内存,可能会导致程序崩溃。

请注意,在C ++中,您可以通过限制其范围来控制非静态变量的生命周期:

for(int i = 0; i < 1000000; ++i)
{
  cv::Mat im = cv::imread("image.png");
} 
// im does not exist anylonger

在此代码中,您加载了一百万次图像,但是您只为一个图像占用内存,因为在每次迭代结束时,im被取消分配。请注意,在C中,使用IplImage,您必须自己使用cvReleaseImage取消分配图像。

那么,您的变量是全局变量是否重要?不,除非你不控制他们的生命,并且你一直保留他们的分配,即使你不使用它们。

<强>更新 您可以拥有本地静态变量,其生命周期是您的应用程序运行的整个时间。这些不是全局的(没有全局范围),但它们始终记忆:

void someFunction()
{
  static cv::Mat images[1000000];
  // one millon of matrices are allocated all the time, even when someFunction ends
}