STL 컨테이너 객체를 참조 대 값으로 이동하는 방법에 대한 오해가 있다고 생각합니다. 합니다 (Ts
벡터에 값을 인쇄하려고) 루프에 대한 두 번째의값에 의한 STL 컨테이너 객체 대 참조로
#include <vector>
#include <set>
#include <cstdio>
class Value {
public:
int x, y;
Value(int a, int b) { x = a; y = b; }
};
class Test {
public:
Test(int x, int y) { values.insert(new Value(x, y)); }
void add(int x, int y) { values.insert(new Value(x, y)); }
std::set<Value *> getValues() { return values; }
private:
std::set<Value *> values;
};
int main() {
std::vector<Test> Ts;
for (unsigned i = 0; i < 5; i++) {
Test t(0, 0);
t.add(i, 0);
Ts.push_back(t);
}
for (unsigned i = 0; i < 5; i++) {
for (std::set<Value *>::iterator it = Ts.at(i).getValues().begin(), ite = Ts.at(i).getValues().end(); it != ite; ++it) {
Value *v = *it;
printf("(%d, %d) ", v->x, v->y);
}
printf("\n");
}
return 0;
}
이 프로그램은 세그먼테이션 폴트 (segfault) : 특히, 나는 이유는 다음과 같은 프로그램이 충돌을 이해하지 않습니다. 그러나 초기 루프를 다음과 같이 변경 한 경우 :
for (unsigned i = 0; i < 5; i++) {
Ts.push_back(Test(0, 0));
}
그런 다음 프로그램이 잘 실행됩니다. 첫 번째 프로그램 (충돌)을 타고에 인쇄 루프를 변경하는 경우 또한, :
for (unsigned i = 0; i < 5; i++) {
std::set<Value *> values = Ts.at(i).getValues();
for (std::set<Value *>::iterator it = values.begin(), ite = values.end(); it != ite; ++it) {
Value *v = *it;
printf("(%d, %d) ", v->x, v->y);
}
printf("\n");
}
그런 다음 프로그램이 충돌하지 않습니다.
이러한 충돌을 일으키는 원인을 이해하고 프로그램 간의 차이점을 알고 싶습니다.
std::set<Value *> getValues() { return values; }
이 멤버 함수 포인터의 당신의 세트의 사본을 반환
프로그램의 메모리 누수가 있습니까? 'Test' 클래스에서'new'를 사용할 이유가 절대적으로 없습니다. – pmr
@pmr 예. 이것은 필자의 큰 프로그램의 테스트 케이스 버전을 줄여서 나중에 값을 적절하게 해제합니다. –
메모리가 누출되는 부분 이외에도 for 루프에'values' 세트가 여러 개 생성됩니다. 왜냐하면'getValues ()'가 사본을 반환하기 때문입니다. 이는 반복기가 메모리의 잘못된 위치에 도달하여 세그멘테이션 오류가 발생하는 이유 일 수 있습니다. –