指针内存分配(以C++为单位)


#include <iostream>
#include <cmath>
#include <limits.h>
#include <stdlib.h>
using namespace std ;
long long NumberHouses = 0 ;
long long ClosestHouse[2] = {0,0} ;
long long TravelTimes = 0 ;
void GetHouses(long long NumH, long long House_X[], long long House_Y[])
{ 
     for (long long a = 0 ; a < NumH ; a++)
     {
         cin >> House_X[a] ;
         cin >> House_Y[a] ;
     }
}
void SortArray(long long NumH, long long SortedArray[], long long HouseArray[])
{
     long long InsertPoint = 0 ; 
     for (int a = 0 ; a < NumH ; a++)
     {
         SortedArray[a] = LONG_MAX ;
     }
     for (int a = 0 ; a < NumH ; a++)
     {
         for (int b = 0 ; b < NumH ; b++)
         {
             if (HouseArray[a] < SortedArray[b]) 
             {
                 InsertPoint = b ; 
                 for (int c = NumH ; c > b ; c--)
                 {
                     SortedArray[c] = SortedArray[c-1] ;
                 }
                 SortedArray[InsertPoint] = HouseArray[a] ;
                 b = NumH ;
             }
         } 
     }
}                 
void FindMedians(long long NumH, int NumMeds, long long SortedArray[], long long MediansArray[])
{
     int MedianNum = 0 ;
     long long *Sorted_X = new long long [NumH] ;
     long long *Sorted_Y = new long long [NumH] ;
     MedianNum = NumH / 2 ;
     if (NumMeds == 1)
     {
         MediansArray[0] = SortedArray[MedianNum] ; 
     }
     else
     {
         MediansArray[0] = SortedArray[MedianNum] ;
         MediansArray[1] = SortedArray[MedianNum + 1] ;
     }
}        
void FindMidHouse(long long NumH, int NumMeds, long long Cords_X[], long long Cords_Y[], long long Meds_X[], long long Meds_Y[]) 
{
     long long *CloseHouses = new long long [NumH] ;
     long long NumPoints = 0 ;
     long long LowestMoves = LONG_MAX ;
     for (int a = 0 ; a < NumH ; a++)
     {
         if (abs(Cords_X[a] - Meds_X[0]) > abs(Cords_X[a] - Cords_Y[0]))
         {
             if (abs(Cords_X[a] - Meds_X[0] <= LowestMoves))
             {
                 LowestMoves = abs(Cords_X[a] - Meds_X[0]) ;
                 CloseHouses[a] = a ;
                 NumPoints++ ;
             }
         }
         else
         {
             if (abs(Cords_Y[a] - Meds_Y[0] <= LowestMoves))
             {
                 LowestMoves = abs(Cords_Y[a] - Meds_Y[0]) ;
                 CloseHouses[a] = a ;
                 NumPoints++ ;
             }
         }
     }
     long long *CloseHousesSums = new long long [NumH] ;
     for (int a = 0 ; a < NumPoints ; a++)
     {
         for (int b = 0 ; b < NumH ; b++)
         {
             if ((abs(Cords_X[CloseHouses[a]]) - Cords_X[b]) > (abs(Cords_Y[CloseHouses[a]]) - Cords_Y[b]))
             {
                 CloseHousesSums[a] = CloseHousesSums[a] + abs(Cords_X[CloseHouses[a]] - Cords_X[b]) ;
             }
             else
             {
                 CloseHousesSums[a] = CloseHousesSums[a] + abs(Cords_Y[CloseHouses[a]] - Cords_Y[b]) ;
             }
         }
     }
     for (int a = 0 ; a < (NumPoints - 1) ; a++)
     {
         if (CloseHousesSums[a] < CloseHousesSums[a+1])
         {
             ClosestHouse[0] = Cords_X[CloseHouses[a]] ;
             ClosestHouse[1] = Cords_Y[CloseHouses[a]] ;
         }
     }
}
void GetClosestHouse(long long NumH, long long House_X[], long long House_Y[], long long ClosestHouse[]) 
{   
     int MedianAmt = 0 ; 
     long long *Sorted_X = new long long [NumH] ;
     long long *Sorted_Y = new long long [NumH] ;
    /* long long *Sorted_1 = new long long ;//[NumH] ;
     long long *Sorted_a = new long long ;//[NumH] ;
     long long *Sorted_b = new long long ;//[NumH] ;
     long long *Sorted_c = new long long ;//[NumH] ;
     long long *Sorted_d = new long long ;//[NumH] ;
     long long *Sorted_e = new long long ;//[NumH] ;
     long long *Sorted_f = new long long ;//[NumH] ;*/

     SortArray(NumberHouses, Sorted_X, House_X) ;
     SortArray(NumberHouses, Sorted_Y, House_Y) ;
     for (int a = 0 ; a < NumH ; a++)
     {
         cout << Sorted_X[a] << "," << Sorted_Y[a] << endl ;
     }
     if (NumH % 2 == 0)
     {
         MedianAmt = 1 ;
     }
     else
     {
         MedianAmt = 2 ;
     }
     cout << MedianAmt << endl ;
     cout << "sun" ;
     long long *Medians_X = new long long [MedianAmt] ;
     long long *Medians_Y = new long long [MedianAmt] ;
     cout << "shine" << endl ;
     FindMedians(NumberHouses, MedianAmt, Sorted_X, Medians_X) ;
     FindMedians(NumberHouses, MedianAmt, Sorted_Y, Medians_Y) ;
     FindMidHouse(NumberHouses, MedianAmt, House_X, House_Y, Medians_X, Medians_Y) ;
}   
void GetHouseDistances(long long NumH, long long House_X[], long long House_Y[], long long ClosestHouse[], long long& TravelTimes)
{ 
      long long Difference_X = 0 ;
      long long Difference_Y = 0 ; 
      for (int a = 0 ; a < NumH ; a++)
      {
          Difference_X = abs(ClosestHouse[0] - House_X[a]) ;     
          Difference_Y = abs(ClosestHouse[1] - House_Y[a]) ;
          //cout << Difference_X << " - Difference_X" << endl ;
          //cout << Difference_Y << " - Difference_Y" << endl ;
          if (Difference_X > Difference_Y)
          {
              TravelTimes = TravelTimes + Difference_X ;
          }
          else
          {
              TravelTimes = TravelTimes + Difference_Y ;
          }   
      }
      //cout << TravelTimes << endl ;
}                                 
int main()
{
     cin >> NumberHouses ;
     long long *House_X = new long long [NumberHouses] ; // x coordinate of houses
     long long *House_Y = new long long [NumberHouses] ; // y coordinate of houses
     GetHouses(NumberHouses, House_X, House_Y) ;
     GetClosestHouse(NumberHouses, House_X, House_Y, ClosestHouse) ;   
     GetHouseDistances(NumberHouses, House_X, House_Y, ClosestHouse, TravelTimes) ;
     cout << TravelTimes << endl ;
}

现在 - 你会注意到我有一个巨大的注释掉的代码部分,其他数组正在类似地创建 - 当我有那些未注释的代码时,我的代码工作 - 但是当我注释它们时,它在输出"sun"后但在"shine"之前崩溃。

我尝试使用其他参数来创建内存长度 - 例如 MedianAmt,这包括其他变量和实际数字。我也尝试使用长长变量作为参数。

我不确定为什么它不起作用 - 如果您希望我提供有关我的代码或情况的更多信息,我将尽力回答它们 - 感谢您的帮助。

编辑:我运行可执行文件,它到达"sun",然后冻结 - 可能需要一两秒钟才能无响应并关闭。NuMH可以达到长长的最大数量 - 64位我不知道我在哪里释放了任何内存 - 我是一个相对新手的程序员 - 并且没有给出错误消息。我认为这也是一个堆损坏问题 - 但是为什么添加上面我注释掉的所有超长数组会导致它不会崩溃?

我可以发布其余的源代码 - 但它有 200 行长,可能有点混乱 - 这会有益吗?

编辑2:至于堆损坏,我将IDE和程序保存在闪存驱动器上-但已尝试在两台不同的计算机上运行它-因此我认为可以安全地假设堆未损坏。也许指向内存的指针无效是问题所在,IDE 会影响我的指针选择内存的位置吗?

编辑 3:我在尝试运行的两台计算机上运行 Windows 7。

编辑4:更新为拥有我的完整源代码。

我想我在SortArray中至少发现了一个错误:

for (int c = NumH ; c > b ; c--)
{
  SortedArray[c] = SortedArray[c-1] ;
}

假设SortedArray的大小为 NumH ,您在第一次迭代时正在超出数组边界进行写入。我没有过多地研究你的算法,但你可能的意思是int c = NumH - 1.

对不起,不能保证这是唯一的。

最新更新