动态数组导致系统崩溃

时间:2014-12-17 04:23:02

标签: c++ arrays dynamic

我有一个类的构造函数,每次调用都会导致整个系统崩溃(它变得无法响应)。我发现这是在动态数组的内存分配期间引起的。 这是我的代码片段:

//constructor
ImageData::ImageData(string givenPath){
    imagePath=givenPath;    //path
    imageObject = imread(imagePath, CV_LOAD_IMAGE_GRAYSCALE); //load Image
    chosenX = 0;            //default value
    chosenY = 0;            //default value
    cols=imageObject.cols;  //columns in image
    rows=imageObject.rows;  //rows in image
    size = cols*rows;       //amount of pixels in image
    startPoint = 0;         //default - top left corner

    //setup memory for dynamic arrays
    mapWithDistances = new int * [size];
    for( int i = 0 ; i < size ; i++ ){
        mapWithDistances[i] = new int[size];
    }

    distances = new int [size];
}

//deconstructor
//deletes dynamic arrays
ImageData::~ImageData(){

    for (int i = 0; i < size; i++) {
       delete [] mapWithDistances[i];
    }

    delete [] mapWithDistances;
    delete [] distances;
}

这可能是微不足道的,但我无法找到解决方案。我在哪里弄错了?

1 个答案:

答案 0 :(得分:0)

欢迎来到O(n ^ 2)。或者O(n ^ 4)取决于n是像素数还是图像的对角线。

为每个像素分配一个大小(像素数)* sizeof(int)的数组。

1000 x 1000像素图像具有100万像素。如果int是4个字节,则上面的代码分配4万亿字节。

这有点资源匮乏。

解决方案是不分配4万亿字节。

通常,使用中等大n值时,必须保持O-memory的使用率非常接近线性,或者跳过箍。这比保持你的O时间更重要,因为你总是可以通过等待更长的时间来获得更多的时间:糟糕的时间表现意味着你等待,糟糕的记忆表现意味着你失败。