2010-02-07 5 views
1

소멸자 내부의 삭제 코드가 기능상 제대로 작동하지 않는다는 것을 전혀 알지 못했습니다. 나는 사람들이 나를 도울 수 있기를 바랍니다.C++에서이 2D Array를 삭제하는 방법

정말 고마워요!

class Array2D 
{ 
     public: 
     Array2D(); 
     Array2D(int, int); 
     ~Array2D(); 

     private: 
     int row; 
     int col; 
     int **p; 
}; 

Array2D::Array2D() 
{ 
     // Default Constructor 
} 


Array2D::Array2D(int rows, int cols) 
{ 
    this -> row = rows; 
    this -> col = cols; 

    p = new int* [row]; 
    for(int i=0; i< row; i++) 
      p[i] = new int[col]; 

    // Fill the 2D array 
    for (int i = 0; i < row; i++) 
      for (int j = 0; j < col; j++) 
      { 
       p[i][j] = rand() % 100; 
      } 
}  


Array2D::~Array2D() 
{ 
    // I'm using this way to delete my 2D array. 
    // however, it won't work! 

    for (int i = 0; i < row; i++) 
    { 
      delete[]p[i]; 
    } 
    delete[]p; 
} 
+1

어떻게 작동하지 않습니까? – Yacoby

+2

실제로'std :: vector '을 사용하고'row * col'에 크기를 조정하고 선형 인덱스를 사용하십시오 _or_ Boost.MultiArray (http://www.boost.org/doc/libs/1_42_0/libs/) multi_array/doc/user.html). – kennytm

+0

소멸자에 브레이크 포인트를 붙이십시오 - "p"라고 예상 하시겠습니까? 유효한 메모리 덩어리를 가리키고 있습니까? –

답변

3

기본 생성자에서 아무것도 초기화하지 않습니다. 이는 소멸자가 기본 생성 객체에서 화를 낼 것임을 의미합니다. 또한 객체를 복사 한 경우 동일한 테이블을 두 번 삭제하려고하므로 클래스에서 작동하지 않는 복사 생성자를 비활성화하지 않습니다. 다음과 같이 변경하십시오. 예 :

class Array2D 
{ 
     public: 
     Array2D(); 
     Array2D(int, int); 
     ~Array2D(); 

     private: 
     int row; 
     int col; 
     int **p; 

     void initialize(int rows, int cols); 

     // disable copy functions (make private so they cannot 
     // be used from outside). 
     Array2D(Array2D const&); 
     Array2D &operator=(Array2D const&); 
}; 

Array2D::Array2D() 
{ 
    initialize(0, 0); 
} 


Array2D::Array2D(int rows, int cols) 
{ 
    initialize(rows, cols); 
}  

void Array2D::initialize(int rows, int cols) { 
    this -> row = rows; 
    this -> col = cols; 

    p = new int* [row]; 
    for(int i=0; i< row; i++) 
      p[i] = new int[col]; 

    // Fill the 2D array 
    for (int i = 0; i < row; i++) 
      for (int j = 0; j < col; j++) 
      { 
       p[i][j] = rand() % 100; 
      } 

} 
+0

답장을 보내 주셔서 감사합니다. 구조가 내 교수에 의해 제공되므로 구조를 수정할 수 없습니다. 이것은 나의 숙제이고 나는 삭제 부분에 갇혀있다. 아래는 편집 된 코드입니다. – zhen

0

class Array2D 
{ 
     public: 
     Array2D(); 
     Array2D(int, int); 
     ~Array2D(); 

     private: 
     int row; 
     int col; 
     int **p; 
     void initialize(); 
     void generateArray(); 
}; 
+1

무엇이 문제입니까? 기본 ctor에 행, col 및 p를 0으로 초기화하십시오. – Ari