2017-08-16 98 views
0
#include <iostream> 
#include <opencv2/core.hpp> 

int main() 
{ 
    cv::Mat test[100000]; 
    std::cout << "testing" << std::endl; 

    return 0; 
} 

返回seg故障。我找不到有关此设置的任何信息。我想不出为什么它会弄乱内存,因为我没有用任何东西来初始化垫子(因此它们都是空的,并且使用更多内存的4K图像没有问题)。太大的Mat对象阵列导致Seg Fault

+0

最有可能是因为你不能挤在栈上'Mat'对象的'100000'。 – VTT

回答

0

解决方案是将Mat s(cv::Mat[])的数组转换为Mat s(std :: vector)的向量。我不会假装理解为什么,但我会猜测矢量会在内部进行更好的内存管理。

#include <iostream> 
#include <opencv2/core.hpp> 

int main() 
{ 
    int size = 100000; 
    std::vector<cv::Mat> test; 
    test.resize(size); 
    for(int i = 0; i < size; i++) 
    {test[i] = cv::Mat::zeros(1, 256, CV_32F);} 
    std::cout << "testing" << std::endl; 

    return 0; 
} 
+0

不需要'size'变量或单独调整大小,只需'std :: vector test(100000);'然后使用'test.size()'或迭代器或基于范围的for循环。 –

+1

至于“引擎盖下的内存管理”,向量分配堆的“数组”。基本上它正在做'新cv :: Mat [100000]'。 –

+0

@Someprogrammerdude我故意使它更加冗长,这样新的程序员可以更容易理解它,但是感谢解释=) – user3303504