2013-05-16 5 views
0

개체를 할당하는 데 사용 된 메모리를 해제 할 수 있습니까? 그렇다면 어떻게 할 수 있습니까? 내가 동적 메모리 할당을 사용하는 경우메모리 해제 (가능한 경우)

class CRectangle { 
    int width, height; 
public: 
    CRectangle (int,int); 
    ~CRectangle(); 
    int area() { 
     return (width * height); 
    } 
}; 

CRectangle::CRectangle (int a, int b) { 
    width = a; 
    height = b; 
} 

CRectangle::~CRectangle() { 
    // Do something here 
} 

이 될 것입니다 :

class CRectangle { 
     int *width, *height; 
    public: 
     CRectangle (int,int); 
     ~CRectangle(); 
     int area() { 
      return (*width * *height); 
     } 
    }; 

    CRectangle::CRectangle (int a, int b) { 
     width = new int; 
     height = new int; 
     *width = a; 
     *height = b; 

    } 

    CRectangle::~CRectangle() { 
     delete width 
     delete height 
    } 

그들은 동일한 출력을 할, 그래서 동적 메모리 할당을 사용하는 장점은 무엇인가?

+1

에서 객체 자체의 크기 이외의 메모리 할당은 없다 그 코드에서 :

는 다음과 같이 그 나타낸 것입니다. –

답변

1

, 모두 기술적으로 정확하고 더 소멸자에서 수행 될 필요가 아무 것도 없다.

두 번째 예제에서는 메모리 할당에 오버 헤드가 있기 때문에 이점이 전혀없고 실제로 메모리가 낭비됩니다. 이러한 오버 헤드는 최소 12 바이트 + 할당 자체입니다. 우리가 int이 4 바이트라고 가정하면이 경우 총 16 바이트입니다 (이는 일반적이지만 대체 방법이 있습니다).

개체의 크기가 다양 할 때 (가장 큰 크기는 메모리 자체를 할당 할 때 예상되는 오버 헤드보다 큽니다.) 또는 개체가 선택 사항 인 경우 개체를 할당하는 것이 좋습니다 개체 할당의 예상 오버 헤드보다 큽니다].

예를 들어 CRectangle이 모든 크기 단위에 대해 CCell 개체 (예 : 게임의 각 셀 내용 일 수 있음)를 보유한다고 가정 해 보겠습니다. 이제 직사각형이 각면에 1 x 1에서 수천까지의 크기가 될 수 있다고 가정하면 각 차원에서 수천 개의 정적 인 2 차원 배열을 사용하지 않을 것입니다. 맞습니까? 그래서 우리는 그것을 동적으로 할당해야합니다. 이 토론의 목적을 위해, 나는 우리가 필요로하는 크기이기 때문에 단지 width * height의 큰 배열을 할당하려고합니다. 2D 할당을 고려해 볼 수는 있지만 코드가 복잡해집니다.

class CRectangle { 
    int width, height; 
    CCell* cellArray; 
public: 
    CRectangle (int,int); 
    ~CRectangle(); 
    int area() { 
     return (width * height); 
    } 
}; 

CRectangle::CRectangle (int a, int b) { 
    width = a; 
    height = b; 
    cellArray = new CCell[width * height]; 
} 

CRectangle::~CRectangle() { 
    delete [] cellArray; 
} 
2

질문에 대답하려면 모든 구성원에게 개체의 인스턴스화시 이 자동으로 할당됩니다 (). 메모리를 확보해야하는 유일한 경우는 동적 할당의 경우입니다 (자동 메모리는 범위를 벗어날 때까지 해제 할 수 없으므로). 이 두 가지의 int 예를 들어 걸릴 :

int a; //automatic allocation at point of declaration, will exist until it falls out of scope 
int *a = new int; //dynamic allocation, exists until deleted. Falling out of scope without releasing memory can cause a memory leak 

을 이제 메모리를 확보 할 수 있습니다 동적 다음 객체를 할당하고 있지만,이 클래스의 외부에서 수행되는 경우.

CRectangle *rect; 
rect = new CRectangle; //dynamically allocated 

//.... 

delete rect; //free memory allocated by rect 
+0

동적 할당과 자동 할당간에 큰 차이점이 있습니까? 두 경우 모두이 경우 동일한 출력에 도달 할 수 있습니까? – 14K

+0

메모리가 현명하고 매우 다릅니다. 객체 현명하고, 자동으로 할당 된 객체와 같습니다.당신은 동적 인 할당 및 그것의 용도에 읽고 싶을지도 모르다 : http://www.cplusplus.com/doc/tutorial/dynamic/ –

+0

당신은 똑똑한 포인터를 디자인하는 경우에 진짜로 기억을 해방하는 것을 고민해야한다. 다른 모든 코드는 메모리를 확보 할시기와 방법을 이미 알고있는 스마트 포인터를 사용해야합니다. –

0

디자인 할 때 소멸자에서 아무 것도하지 않아도됩니다.

이 OK입니다 : 특정 예에서

CRectangle::~CRectangle() { 
} 
+0

-1이 잘못되었습니다. 누군가가 'new'를 통해 런타임에 객체를 생성하면 항상 삭제해야합니다. 이 소멸자의 경우. – RvdK

+0

@Rvdk : 클래스의 소멸자가 자신을 삭제할 수 없습니다. 그것은 무한 재귀를 일으킬 것입니다. –

+0

아니, 난 너비와 높이 CRectangle에서 새를 통해 만든에 대해, 그들은 소멸자에서 삭제되어야한다고 얘기하고 있습니다. CRectangle 자체의 생성은 그것이 생성 된 어딘가에 있어야합니다. – RvdK