【问题标题】:Dynamic array cause system crash动态数组导致系统崩溃
【发布时间】:2015-02-15 13:42:13
【问题描述】:

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

//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;
}

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

【问题讨论】:

  • for( int i = 0 ; i &lt; size ; i++ ) mapWithDistances[i] = new int[size]; 如果new 失败,你会怎么做?此代码将有内存泄漏。即使您知道该做什么,您也必须编写代码来执行catch,然后释放所有先前成功的分配。使用容器类,或仅使用 2 个分配编写代码(搜索 SO 以了解如何执行此操作)。
  • 您的代码会严重分割堆内存。如果您要编写这样的代码,请参阅分配二维数组的替代方法:stackoverflow.com/questions/27425126/…

标签: c++ arrays dynamic


【解决方案1】:

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

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

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

这有点浪费资源。

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

一般来说,在处理中大型 n 值时,您必须保持 O 内存使用量真正接近线性,或者跳过循环。这比降低 O-time 更重要,因为您总是可以通过简单地等待更长的时间来获得更多时间:时间性能差意味着您等待,内存性能差意味着您失败。

【讨论】:

  • 奇怪的是,例如当我手动设置 size = 4 时,它仍然会冻结应用程序(尽管我可以停止调试,无需重置)。我需要存储有关彼此之间像素颜色差异的信息。真的不能使用大小为 [10^6][10^6] 的数组吗?
  • @user3206986 - 您的代码是堆碎片的噩梦。有关如何在两次分配中执行此操作的链接,请参阅我上面的评论,而不是 1000 次分配。如果您有足够的内存,您会立即找到,并且不要延迟内存耗尽,直到您到达循环的中间。
猜你喜欢
  • 2019-07-12
  • 2013-04-01
  • 1970-01-01
  • 2013-09-28
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多