inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버

vector 순회중 삽입/삭제 해결법에 대해 질문드립니다

291

wlsdn3740

작성한 질문수 2

0

강의 정말 잘듣고 있습니다!!

 

vector 순회중에 데이터 삽입/삭제가 일어나면 크래시가 난다는건 이해했습니다!

근데 이를 스마트 포인터를 사용하거나 생포인터에 아이디 방식을 사용하여 아이디로 상대가 살아있는지 확인하는 법이 있다고 하셨는데 스마트 포인터로는 어떻게 해결이 되는지 정확히 이해가 되지 않아 질문드립니다.

 

아무래도 스마트 포인터를 사용하고 vector 에 들어있는 스마트 포인터는 생존해있다는게 보장이 되기 때문에 맘편히 사용해도 된다는 것 때문에 해결이 되나 생각을 해보았습니다.

 

vector<shared_ptr<int>> v;

void Test1()

{

shared_ptr<int> d = make_shared<int>();

*d = 4;

v.push_back(d);

}

 

void Test2()

{

v.pop_back();

}

 

int main()

{

 

{

shared_ptr<int> a = make_shared<int>();

shared_ptr<int> b = make_shared<int>();

shared_ptr<int> c = make_shared<int>();

*a = 1;

*b = 2;

*c = 3;

v.push_back(a);

v.push_back(b);

v.push_back(c);

}

 

vector<shared_ptr<int>>& temp = v;

for (auto& asd : temp)

{

Test2();

cout << *asd << endl;

}

 

}

 

하지만 이렇게 테스트를 해본 결과 삽입할때는 크래시, 삭제할때는 날라간 쓰레기 값을 사용합니다.

 

당연히 제가 뭔가를 잘못 생각하고 있겠지만 고민하다가 답이 나오질 않아 질문 드립니다!

c++

답변 1

0

Rookiss

2가지 문제를 구분해야 합니다.

vector 순회중에 데이터 삽입/삭제가 일어나면 크래시가 난다는건 이해했습니다!
순회중에 삽입/삭제 문제는 shared_ptr과 무관하게
그냥 vector 동시 접근 관련 문제입니다.
따라서 shared_ptr을 한다고 무조건 해결되지 않습니다.

vector<shared_ptr<int>> temp = v;
에서 &을 빼야 합니다. 그러면 복사를 해서 순회하니 문제가 사라지죠.

(복사라도 하나, 포인터 복사와 유사하기에 문제 없음)

0

wlsdn3740

복사로 vector 를 받았을때 문제점이 삽입때는 괜찮았지만 데이터 삭제일때는 날라간 메모리를 건드리니 메모리 오염이 생긴다고 들었습니다. 그러면 스마트 포인터를 사용해도 그 문제는 해결이 안되는게 맞나요? 복사를 하면 refcount 가 하나 늘어서 중간에 객체를 날려도 복사된 vector 에서 들고있으니 이미 날린 메모리를 건들게 되지 않나요?

0

Rookiss

스마트포인터에 대해 더 찾아보시거나 실습을 해보세요.
스마트포인터를 들고 있는 vector를 복사하면,
스마트포인터가 복사되는데, 당연히 이런 부분은 operator overloading이 되어 있어
refcount를 1 증가시킨 동일한 포인터를 가리키며 생성됩니다.

문제집은 없나요 수업을 어떻게 들어야 할지 모르겠어요

0

114

2

동적배열 Vector의 push_back 함수에서 조건문 질문

0

76

1

디버깅할때 메모리보는법 단축키가 뭐죠??

0

93

1

113-충돌처리 강의에서 22:26 부근의 SetPos()를 적용해도 충돌되지 않고 뚫고 지나가게 됩니다.

0

89

1

SaveFile에서 크래시 발생하는 분들 체크해보세요

1

70

1

수업자료 확인 부탁드립니다.

0

106

3

explicit을 붙였을 때 빨간줄이 뜨는 이유가 맞는지 궁금합니다.

0

100

0

22강에서 구조체와 포인터로 설명해주셨는데 패딩의 경우는 어떻게 되나요?

0

89

2

리소스 매니저 강의 18분 부근

0

89

1

[Service강의] owner -> shared_ptr

0

80

2

C#에서 생성자 관련 질문

0

83

2

특정 조건에서만 함수를 반환할 때

0

91

2

스택 empty

0

105

2

섹션4 배열실습 질문입니다.

0

133

1

섹션3 '파일분할' 강의 질문입니다.

0

99

1

Defines.h의 DECLARE_SINGLE관련 질문입니다.

0

110

1

세션8 우선순위 큐 pop함수의 Predicate 적용 관련 질문이 있습니다.

0

182

3

섹션9 함수 포인터 관련 질문입니다.

0

137

1

exercise_A 번 문제 해결방법에 대한 질문.

0

150

1

[강의명: virtual 소멸자] 자식 클래스의 소멸자에도 virtual 을 붙이시는 이유가 궁금합니다

0

200

2

Scene과 SceneManager 강의 수강 중 키보드 입력 오류

0

149

1

Window API 강의 수강 중 LARGE_INTEGER 타입 변환 오류

0

198

3

섹션15 스마트 포인터 20:00 질문이요!

0

128

1

55강 수업자료 빌드를 하면 이상합니다.

0

133

1