我有一个类的构造函数,每次调用都会导致整个系统崩溃(它变得无法响应)。我发现这是在动态数组的内存分配期间引起的。 这是我的代码片段:
//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;
}
这可能是微不足道的,但我无法找到解决方案。我在哪里弄错了?
答案 0 :(得分:0)
欢迎来到O(n ^ 2)。或者O(n ^ 4)取决于n是像素数还是图像的对角线。
为每个像素分配一个大小(像素数)* sizeof(int)
的数组。
1000 x 1000像素图像具有100万像素。如果int
是4个字节,则上面的代码分配4万亿字节。
这有点资源匮乏。
解决方案是不分配4万亿字节。
通常,使用中等大n值时,必须保持O-memory的使用率非常接近线性,或者跳过箍。这比保持你的O时间更重要,因为你总是可以通过等待更长的时间来获得更多的时间:糟糕的时间表现意味着你等待,糟糕的记忆表现意味着你失败。