2011-12-29 5 views
2

사람, 나는이 모든 프로그래밍 토크에 익숙하지 않다. 지금까지는 인터넷 검색으로 답변을 찾는 것이 매우 쉬웠으나 바로 여기서 내가 묻고 싶은 것을 표현하는 데 큰 어려움이 있습니다. 시도해 보겠습니다. 벡터를 지우는 것은 메모리를 해제하기 전에 소멸자를 호출하는 것입니까? 이제 struct-vector가 파괴되면 어떻게 반응합니까? 하나는 이런 것들에 대한 소멸자를 정의하지는 않지만 구조체가 "소멸"되면 각 멤버의 소멸자도 호출된다고 가정하는 것이 맞습니까?vector :: erase()도 구조체의 멤버 벡터를 지움

나를 당신에게 예를 보자 :

#include <string> 
#include <vector> 
struct ding_t { 
    std::string dang; 
} foo; 

strung boom_t { 
    vector <ding_t> chuck; 
} bar; 

int main() { 
    vector <boom_t> tom; 
    tom.resize(10); 
    tom[4].chuck.resize(5); 
    tom[4].chuck[3].dang = "jerry"; 
    tom.erase(); 

    return 0; 
} 

을,이 경우에는 메모리가

tom[4].chuck.resize(5); 

에 의해 할당 된 것뿐만 아니라 해제? 미안 해요, 내 어휘,하지만 지금은 포인터에서 벡터의 더 복잡한 cpp 언어에 상응하는 이동하려고합니다. 나는 내 관점을 알기를 바랍니다. 사전에 감사드립니다. 이미 말한 것처럼이 질문에 답을 얻으려면이 질문에 대한 경계를 알지 못합니다.

+0

작업중인 언어의 태그를 추가하면 더 많은 관심을 갖게됩니다. 죄송합니다. 질문에 대답 할 수 없습니다. + 1'd – vdbuilder

답변

4

예, 메모리가 자동으로 해제됩니다.

벡터가 파괴되면 벡터에 포함 된 모든 요소의 소멸자가 호출됩니다. struct에 대한 소멸자를 정의하지 않았으므로 컴파일러에서 기본값을 제공합니다 (아무 것도하지 않습니다). 당신의 벡터 개체에 대한 포인터를 포함하는 경우

그러나 그것 (벡터가 포인터이 아닌 뾰족한 물체의 소멸자를 호출하기 때문에) 벡터를 파괴한다 전에 개체의 소멸자를 호출 할 당신의 책임이있다, 나중에 다른 방법으로 액세스 할 수없는 경우

2

질문에 대한 답변은 http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.11이고 C++의 소멸자에 대한 좋은 치료법은 전체 기사를 참조하십시오. 두 번째 질문에 관해서는

: "크기 조정의 경우 인 (자체 메모리 할당을 관리 할 수있는 벡터의 책임이기 때문에 예, tom[4].chuck.resize(5);에 의해 할당 된 메모리 (뿐만 아니라 해방 얻을 것이다) "호출).

+0

아, 유명한 cpp FAQ, 나는 그 생각을하지 못했습니다. 여러분 모두에게 감사드립니다. 이것은 정말로 도움이되었습니다. 이제 그것에 대해서 생각해 보면 루프에서 크기를 조정하고 지우고 시간이 지남에 따라 메모리 사용량이 증가하는지 확인할 수도 있습니다. –

1

답변 : new 연산자로 동적으로 개체를 할당하지 않으므로 수동으로 할당을 해제하지 않아도됩니다. 자동으로 완료됩니다.

확인. 코드로 돌아 가기 :)

여섯 번째 요소를 지우려면 tom.erase (tom.begin()+5)을 사용하십시오.

그리고 모든 요소를 ​​지우려면 tom.erase (tom.begin(),tom.end())을 사용하십시오.

처음 세 요소를 지우려면 tom.erase (tom.begin(),tom.begin()+3)을 사용하십시오.

#include <string> 
#include <vector> 
using namespace std; 

struct ding_t 
{ 
    std::string dang; 
} foo; 

struct boom_t { 
    std::vector <ding_t> chuck; 
} bar; 

int main() { 
    vector <boom_t> tom; 
    tom.resize(10); 
    tom[4].chuck.resize(5); 
    tom[4].chuck[3].dang = "jerry"; 

    //error C2661: 'erase' : no overloaded function takes 0 parameters 
    //tom.erase(); 

    // erase the 6th element 
    tom.erase (tom.begin()+5); 

    // erase the first 3 elements: 
    //tom.erase (tom.begin(),tom.begin()+3); 

    // erase everything: 
    //tom.erase (tom.begin(),tom.end()); 

    return 0; 
} 
0

좋아, 나는이 작은 수표를 확인했다. (내가 어째서 이런 생각을하지 않았는지 ... 어제 꽤 늦었습니다 ...) 초기 코드가 잘못 작성되어 작동하지 않아 사과드립니다.

이 :

#include <string> 
#include <vector> 

struct ding_t { 
    std::string dang; 
} foo; 

struct boom_t { 
    std::vector <ding_t> chuck; 
} bar; 

int main() { 
    std::vector <boom_t> tom; 

    while (true) { 
     tom.resize(10); 
     tom[4].chuck.resize(5); 
     tom[4].chuck[3].dang = "jerry"; 
     tom.erase(tom.begin(), tom.end()); 
    } 

    return 0; 
} 

원인에는 메모리가 사용 된 메모리가 안정 누출 없음.

관련 문제