2011-06-04 88 views
0

我在教育目的上做了這個。 這樣的想法: 我有類Array。我繼承它的類Darray,並添加必要的尺寸C++繼承陣列的darray

它喜歡這樣:

的main.cpp

int main(int argc, char *argv[]) 
{ 


    Array obj; 
    obj.output(); 

DArray obj2; 
obj2.output(); 

    return 0; 

}

 class Array 

     { 
     public: 
      int *x,sizem; //одно измерение, массив 
       // можно объявить здесь как **x , но это не то 

     Array(); 
     ~Array(); 
    virtual void output(); 
    }; 


    class DArray:public Array 
{ 
public: 
int **z; 
    int sizen; 
    DArray(); 
~DArray(); 
virtual void output(); 
}; 

realisation.cpp

  Array::Array() 
     { 
     sizem=5; 

     x=new int[sizem]; 

     for(int i=0;i<sizem;i++) 
     x[i]=i; 
     } 

     Array::~Array() 
    { 
     delete []x; 
     } 


     void Array::output() 
     { 
     for(int i=0;i<sizem;cout<<x[i]<<" ",i++); 
     cout<<"\n"; 
     } 


      void DArray::output() 
     { cout<<"\n"; 

     for(int i=0;i<sizem;i++) 
     { for(int j=0;j<sizen;j++) 
       cout<<z[i][j]<<" "; 
      cout<<"\n"; 
       } 
       }  


     DArray::DArray() 
      { 
      int i; 
      sizen=sizem; 

      z=new int*[sizem]; // одно измерение уже есть, т.е. это одна строка 


      for(i=1;i<sizem;i++) 
       z[i]=new int[sizem]; 


      for(int i=1;i<sizem;i++) // if i don't initialization matrix, all'll 

      works right,compiles,and run, but AFAIK when i allocate space dynamically, 
     it must be intitializationed self by zeros, but it isn't particually equal 
      zeroes, the fisrt two column are equal some random number, other 
     are equal zero. 


      for(int j=0;j<sizen;j++) 
       { 
       z[i][j]=2; 
       } 

       *z=x; // i've already array x , that was inheritanced, just point address 
      } 



       DArray::~DArray() 
      { 


      for(int i=1;i<sizem;i++) 
      delete z[i]; 


      // yet one problem 
      // i can't delete x e.g. delete []x 
     // but it should work! 

       delete []z; 
        } 

PS我的工作沒有錯誤,但我認爲有內存泄漏,但無法趕上爲什麼

所有的招數已經構造已經完成,其他的一切都像輸出矩陣/陣列一般的東西。這就是爲什麼我認爲,問題是有

thanks you mates! 

,但我不明白,但有一件事

  z=new int*[sizem]; 

      for(i=1;i<sizem;i++) 
      z[i]=new int[sizem]; 


     for(int i=1;i<sizem;i++) 
     { 
     for(int j=0;j<sizen;j++) 

      cout<<z[i][j]<< " "; 
      cout<<"\n"; 
     } 
as i think i have to receive here ones zeros. byt i receive something like 

      2532336 2532336 0 0 0 
      2532336 2532336 0 0 0 
      2532336 2532336 0 0 0 
      2532336 2532336 0 0 0 

爲什麼?

+0

什麼是** x? йух? – Anycorn 2011-06-04 14:50:58

+0

關於你在說什麼? – Tebe 2011-06-04 14:52:11

+0

這是一個笑話,請忽略。 – Anycorn 2011-06-04 14:54:05

回答

1

有沒有內存泄漏,但有new和delete之間的一個不匹配:

您使用new[]這裏:

for(i=1;i<sizem;i++) 
    z[i]=new int[sizem]; 

,但你使用delete(不delete[] )在這裏:

for(int i=1;i<sizem;i++) 
    delete z[i]; 

由於改爲delete[] z[i];,沒有警告的的valgrind:

==29235== HEAP SUMMARY: 
==29235==  in use at exit: 0 bytes in 0 blocks 
==29235== total heap usage: 7 allocs, 7 frees, 160 bytes allocated 
==29235== 
==29235== All heap blocks were freed -- no leaks are possible 

編輯:關於你的第二個問題,如果你想在陣列用零初始化,使用

z[i] = new int[sizem](); // note the pair of parentheses 

或只使用矢量像其他人一樣。

+0

mmm .. valgrid,這很有趣。我改變了源代碼,並試圖用valgrid測試它:valgrid -ls -l myprogram。但我收到此:== 20385 == HEAP彙總: == 20385 ==在退出使用:13,268字節在29個塊 == 20385 ==總堆使用情況:251分配,222釋放,34,990字節分配 或我應該使用其他選項嗎?你有什麼樣的想法? – Tebe 2011-06-04 20:48:21

1

z是一個二維數組......你已經爲每個z [i]分配了一個數組作爲數組。

所以你需要使用:

delete[] z[i]; 
+1

他並沒有在DArray的ctor中分配z [0],只有z [1]以上。 – Cubbi 2011-06-04 15:06:36

+1

沒錯,沒注意到啓動條件。 – 2011-06-04 15:07:44

1

我已經解壓縮代碼中的最小的樣品。

Array::Array() 
{ 
    sizem=5; 

    x = new int[sizem]; 
} 

Array::~Array() 
{ 
    delete[] x; 
} 

DArray::DArray() 
{ 
    z = new int*[sizem]; 

    for(int i=1; i < sizem; i++) 
     z[i]= new int[sizem]; 

    *z=x; // Wierd but ok 
} 

DArray::~DArray() 
{ 
    for(int i=1;i<sizem;i++) 
     delete z[i]; // Should be delete[] since elements were allocated through z[i] = new int[sizem]; 

    delete[] z; 
}