0

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

die Auslagerungsdatei ist zu klein, um diesen Vorgang auszuführen(翻译过来是这样的:存储文件太小,无法执行此过程)

我的问题是:这是由于声明为全局的数组太多,还是问题必须与其他东西有关,也许是太多的 IplImages(我已将数百个声明为全局)?我注意到通常数组的大小似乎是有限制的。但是,声明几个总和更大的较小数组是有效的 - 或者至少也达到一定的限制......因此上述问题?我能做些什么来避免这种情况?

编程语言:c++,vs 2008,控制台应用程序

4

1 回答 1

2

对于您的问题,您的变量是否是全局、本地、类成员等并不重要。重要的事实是这些变量的寿命。如果同时加载大量图像,您可能会遇到内存问题。例如(让我使用 C++ 语法cv::Mat而不是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
}
于 2013-09-16T22:34:03.513 回答