我对全局声明的数组有一般性的问题。我遇到过这个问题。我不能再同时多次运行我的应用程序,我收到一条消息(用德语):
die Auslagerungsdatei ist zu klein,um diesenVorgangauszuführen(翻译成这样的东西:存储文件太小而无法执行此过程)
我的问题是:这是因为太多的数组被声明为全局还是问题必须与其他东西相关,也许太多的IplImages(我已经将其中的数百个声明为全局)?我注意到一般来说阵列的大小似乎有限制。然而,声明几个总和更大尺寸的小阵列可以工作 - 或者至少达到一定的限制......因此上面的问题?我该怎么做才能避免这种情况?
编程语言:c ++,vs 2008,console app
答案 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
}