-1

과부하로 delete을 사용하거나 del() 기능 또는 다른 클래스 멤버를 할당 해제해야합니까?클래스 멤버를 올바르게 할당 해제하는 방법은 무엇입니까?

class Field 
{ 
private: 
    size_t* square = new size_t[5]; 
public: 
    void del() 
    { 
     delete[] square; 
    } 
    void operator delete (void* p) 
    { 
     delete[] reinterpret_cast<Field*>(p)->square; 
    } 
}; 
int main() 
{ 
    Field f; 

    delete &f; 
    //or 
    f.del(); 
} 
+11

아니요. [소멸자] (http://en.cppreference.com/w/cpp/language/destructor)를 사용하십시오. –

+5

new를 사용하거나 피할 수 있으면 삭제하지 마십시오. 'vector' 사용 – AndyG

+0

[최신 C++에서 새 포인터와 삭제 포인터, 원시 포인터 또는 C 스타일 배열을 사용하는 유즈 케이스가 있습니까?] (https://stackoverflow.com/questions/46991224/are-there-any- 유효 사용 사례 - 사용 - 새롭고 - 삭제 - 원시 포인터 - 또는 -C 스타일 - arr) – user0042

답변

6

당신은 소멸자를 찾고 :

class Field 
{ 
private: 
    size_t* square = new size_t[5]; 
public: 
    ~Field() { delete [] square; } 
}; 

그러나 Rule of Zero을 배우고 리소스 관리 클래스에 대신 연기 : 이동 의미를 갖는 이점 이미 수행있다

class Field 
{ 
private: 
    std::unique_ptr<size_t[]> square; 
public: 
    Field() : square(new size_t[5]) { } 
}; 

옳은 일, 이미 사용 불가능한 복사 의미, 그리고 이미 자원을 관리하고있는 소멸자.

2

나는 클래스 멤버 할당을 해제 과부하 또는 델() 함수 또는 뭔가를 삭제 사용해야합니까?

도 아니다.

소멸자를 추가하고 소멸자의 메모리를 삭제하십시오.

class Field 
{ 
    private: 
    size_t* square = new size_t[5]; 
    public: 
    ~Field() { delete [] square; } 
}; 

여기에 Rule of Three을 체크 아웃하고 규칙을 따르십시오.

1

우선 : 삭제 연산자를 재정의하지 마십시오. 이것은 거의 의미가 없습니다. 필요한 경우, 종속 객체를 "정리"하는 것은 소멸자에서 수행됩니다.

그래서 당신은 필드 (명시 적 또는 암시)를 삭제하면 소멸자를 게재 할 것을

class Field { 
    ... 
    virtual ~Field() { delete[] square; } 
    ... 
} 

노트를 작성 것입니다.

두 번째로 이전에 new으로 만든 개체에 대해서만 delete을 호출하십시오. Field f; delete &f처럼 자동 저장 기간을 가진 개체는 삭제하지 마십시오.

셋째, 자동 저장 기간이 옵션 인 경우 new으로 개체를 할당하지 마십시오. 따라서 작성한 경우 전체 문제를 극복 할 수 있습니다.