对于您的问题,您的变量是否是全局、本地、类成员等并不重要。重要的事实是这些变量的寿命。如果同时加载大量图像,您可能会遇到内存问题。例如(让我使用 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
}