2014-10-13 9 views
-2

동적으로 생성 된 구조체의 잘못된 해제로 인해 발생하는 것으로 보이는 C++ 코드의 버그가 있습니다. 구조체의 형식에 :C++에서 새로운 구조체 삭제하기

typedef struct 
{ 
    char *value; 
} Element; 

typedef struct 
{ 
    int num; 
    Element **elements; 
    int *index; 
} Container; 

그들은 다음과 같이 작성됩니다

Element *new_element(int size) 
{ 
    Element *elem = new Element; 
    elem->value = new char[size]; 
    return elem; 
} 

Container *new_container(int num) 
{ 
    Container *cont = new Container; 
    cont->num = num; 
    cont->elements = new Element*[num]; 
    cont->index = new int[num]; 
} 

이 해방하는 올바른 방법은 무엇입니까?

+11

가장 쉬운 방법은 포인터를 사용하지 않고 "new"를 사용하지 않고 C++로 코드를 다시 작성하는 것입니다. 그러면 아무 것도 자유롭게하는 것에 대해 걱정할 필요가 없습니다. – juanchopanza

+5

알다시피, 나는'new []'대신'std :: vector'를 사용하여 해결할 수있는 질문 목록을 유지하고있었습니다. 몇 달 전에 최신 상태로 유지하지 않으면 VPS의 하드 디스크가 꽉 차게됩니다. – rightfold

답변

6

쉽게 컴파일러에 아웃소싱 자원 관리 모든 확보 문제를 해결할 수 있습니다

모든 미래의 자원 관리 문제에 대한
#include <cstdlib> 
#include <string> 
#include <vector> 

struct Element { 
    Element() = default; 
    explicit Element(std::size_t size) : value(size, '\0') { } 

    std::string value; 
}; 

struct Container { 
    explicit Container(std::size_t size) : elements(size), index(size) { } 

    std::vector<Element> elements; 
    std::vector<int> index; 
}; 

, The Definitive C++ Book Guide and List를 참조하십시오.

+0

이것이 방법 일 수 있습니다. 문법을 잘 모르겠다. struct가 둘 이상의 매개 변수로 초기화 된 경우 어떻게 작성합니까? 다음과 같이 말하십시오 :'typedef struct {int a; int b} Element;'이런 식으로 삭제하고 해제 할 필요가 없습니까? – Schemer

3

이 의미있는 방식으로 수행해야합니다. 다른 사람들이 지적했듯이, 그것은 자동으로 만들어 질 수 있습니다. 소멸자를 청소해야만하는 것은 아닙니다. 그러나, 실제 질문에 대답하는 것을 실패, 새로운 배열을 삭제하는 구문은 다음과 같습니다

int x = new x[20]; 
delete [] x; 

당신 물론 각을 삭제하는 요소를 통해 루프를해야합니다, 그래서 새로운 모든 것을 삭제해야합니다 요소 배열 자체를 삭제하기 전에 순서대로 하나씩. 편의점 유형 에 기침이 인 벡터 기침으로 누군가를 감쌌을 것입니다.