2016-12-29 1 views
2

스마트 포인터를 사용하여 C++에서 양방향 배열을 선언하는 방법을 알고 싶습니다. 원시 포인터로 관리 할 수 ​​있습니다. 코드는 다음과 같습니다C++에서 스마트 포인터를 사용하여 양방향 매트릭스를 선언하십시오.

class Matrice{ 

    int size; 
    int **val; 

    public: 
     Matrice(int size1) 
     { 
      val = new int* [size1]; 
      size = size1; 
      for (int i = 0; i < size1; i++) 
      { 
       val[i] = new int[size1]; 
      } 

      for (int i = 0; i < size1; i++){ 
       for (int j = 0; j < size1; j++) 
       { 
        val[i][j] = j; 
       } 
      }  
     } 

     ~Matrice() 
     { 
      delete []val; 
      cout<<"Destroyed matrix! \n"; 
     } 
    }; 

답변

1

사용할 수 있습니다이 솔루션을 사용 std::make_unique는 C++ 14부터 뭔가

#include <memory> 
#include <iostream> 


class Matrice 
{ 
    int size; 

    std::unique_ptr<std::unique_ptr<int[]>[]> val; 

    public: 

    Matrice(int size1) : size{size1}, 
     val{ std::make_unique< std::unique_ptr<int[]>[] >(size) } 
    { 
     for (int i = 0; i < size; ++i) 
     { 
     val[i] = std::make_unique<int[]>(size); 

     for (int j = 0; j < size; ++j) 
      val[i][j] = j; 
     } 
    } 

    ~Matrice() 
    { std::cout << "Destroyed matrix! (no more delete[]) \n"; } 
}; 

int main() 
{ 
    Matrice m{12}; 
} 

같아야합니다. C에서

생성자는, 현재의 소멸자 val을 삭제 잘못

Matrice(int size1) : size{size1}, 
     val{ std::unique_ptr<std::unique_ptr<int[]>[]> 
      {new std::unique_ptr<int[]>[size]} } 
    { 
     for (int i = 0; i < size; ++i) 
     { 
     val[i] = std::unique_ptr<int[]>{ new int[size] }; 

     for (int j = 0; j < size; ++j) 
      val[i][j] = j; 
     } 
    } 

욕실 옆모습으로 작성해야 11 ++;

delete []val; 

당신은 무료 전용 메모리는 또한 OK

for (i = 0 ; i < size ; ++i) 
    delete[] val[i]; 

delete[] val; 
+0

입니다

val[i] = new int[size1]; 

에 할당 된 메모리를 삭제해야

val = new int* [size1]; 

할당. 정말 고마워 – DaianaB

관련 문제