2013-10-08 1 views
1

이 C++ 코드가이 방식으로 작동하는 이유를 설명 할 수 있습니까? 그리고 어떻게 미래에이 '벡터'문제를 피할 수 있을까요? void my_str :: insert()벡터의 요소 멤버 메서드에서 벡터 요소를 삽입하면 destroys가 *

에서

#include <iostream> 
#include <vector> 
using namespace std; 
struct my_str { 
    int x; 
    my_str() { 
     x = 0; 
    } 
    void insert(); 
}; 
vector<my_str> p; 

void my_str :: insert() { 
    p.push_back(my_str()); 
    x = 123; 
} 

int main() { 
    p.push_back(my_str()); 
    p[0].insert(); 
    cerr << p[0].x; 
    return 0; 
} 
+1

"이 *'을 (를) 파괴한다는 것은 무엇을 의미합니까? 이 코드의 행동은 당신을 혼란스럽게합니까? – delnan

+0

@delnan : "123"이 아닌 "0"을 표시한다고 가정합니다 (http://ideone.com/jyagJK). –

답변

4

p.push_back(my_str());this가 잘못

x = 123; 

붐이다, 벡터 재 할당이 발생! 힙 손상.

향후 이러한 문제를 방지하려면 포함 된 개체에서 벡터를 편집하지 마십시오. 또는 필요한 경우 개체 멤버를 사용하지 않았는지 확인하십시오.

+0

이것은 trie 클래스를 구현했을 때 일어난 일입니다. 포인터가 느리기 때문에 벡터를 사용하기를 선호합니다 (포인터가 느리기 때문에) .. 내 잘못 입력 했습니까? –

+0

벡터에서 자신 만의 트리가 필요하다면, 모든 오브젝트의 멤버 수정 후에 벡터를 수정하십시오. 모든 포인터는 잠재적으로 유효하지 않음을 기억하십시오 (색인 만 사용할 수 있음). 조심해. –

+0

@AlexVelea 또는, '벡터 '을'vector >'으로 변경할 수 있습니다. 모든 트라이 노드를 벡터에 저장하는 경우 각 노드에 대용량 데이터 유형을 저장하는 경우 상당히 많은 비용이 발생할 수있는 모든 재 할당마다 노드 주변을 복사해야하기 때문에 더 의미가 있습니다. 노드를 따로 따로 할당하고 포인터 벡터를 사용하여 순서를 관리하는 것이 좋습니다. –