본문 바로가기

Development Experience/C, C++

(14)
iterator 쓸 때 주의 사항 (feat. Cannot dereference end list iterator) c++ 에서 map의 iterator를 사용하다가 'Cannot dereference end list iterator' 오류를 맞닥뜨렸다. 코드만 보았을 때에는 괜찮아 보였는데,, 원인은 map의 find() 함수 리턴값이 iterator 였다는 점에서 시작한다. find() 함수는 map 내에서 찾고자 하는 값이 없을 경우 map::end() 를 리턴하는데, 이 end()에 접근해서 데이터를 읽으려고 하면 에러가 발생하기 때문이다. 아래 코드의 1번 시나리오처럼 map에 있는 값에 접근하면 iter->second 에도 정상적으로 접근하여 값을 얻어온다. iter가 map의 end()를 가리키지 않기 때문이다. 반면, 2번 시나리오처럼 map에 없는 값에 접근하면 iter는 map내에 찾는 데이터가 없다..
LNK2019 에러와 네임 맹글링, 그리고 extern LIVE555로 Frame을 받아서 FFMPEG에서 Decoding 하는 프로그램을 만드는 중에 FFMPEG의 함수를 사용하는 부분에서 자꾸 LNK2019 에러가 발생하였다. 몇 번의 삽질 끝에 해결하였는데,이 과정에서 알게 된 내용은 아래와 같다. 1. LNK2019 에러 Linker > General > Additional Library Directories에 경로를 추가해도 해결이 안될 때에는 Linker > input > Additional Dependencies 에도 lib 파일을 추가해주어야 한다. 예를 들어 FFMPEG 라이브러리를 추가하고 싶은 경우 avformat.lib, avcodec.lib 등의 lib 파일 이름을 적어주면 오류가 해결된다. 2. 네임 맹글링 (Name Mangling..
C++ unique_ptr 의 deleter 1. c++ unique_ptr 을 생성할 때 파라미터로 deleter 함수를 넣어줄 수 있다. ex) std::unique_ptr upMyClass(new MyClass(), [](MyClasss* ptr){ delete ptr; });
c++ std::function 과 std::bind, C2893 Error c++ std::function 변수를 선언할 때 std::bind() 를 사용한다. 이 때 함수의 파라미터로 전달할 인자들을 bind 함수내에 같이 명시해줘야 C2893 에러가 발생하지 않는다.
C++ 다른 프로젝트에 있는 파일 참조하기 1. 다른 프로젝트에 선언된 클래스를 테스트하려 했는데 LNK2019 에러가 발생하였다. 헤더는 어찌저찌 상대 경로를 찾아서 넣었는데 결국 실제 정의를 못 찾기 때문에 문제가 된다고 한다. (by 구글느님) 2. 테스트 프로젝트를 따로 만들어서 테스트 관련 작업을 하려고 했는데 그냥 기존 프로젝트에서 테스트 클래스를 하나 만드는 방식으로 변경해서 테스트를 진행하였다.
C++ 스마트 포인터 간단 정리 1. unique_ptr, shared_ptr, week_ptr 은 raw pointer를 담는 그릇이라고 생각하면 쉽다. 2. unique_ptr => raw pointer에 대한 소유권을 단 하나의 스마트 포인터 객체만 가질 수 있다. 만일 다른 unique_ptr에게 raw pointer에 대한 소유권을 넘기려면 move 함수를 사용해야 한다. 3. shared_ptr => raw pointer에 대한 소유권을 여러 개의 스마트 포인터 객체가 가질 수 있다. raw pointer를 소유하고 있는 shared_ptr의 개수가 늘어날수록 raw pointer에 대한 참조 카운트가 증가한다. 4. week_ptr => raw pointer에 대한 소유권을 여러 개의 스마트 포인터 객체가 가질 수 있는 점..
C++ ofstream, localtime_s 함수, PSCP 1. C++ std::ofstream 을 사용할 때 파라미터로 보내는 string에 ':' 이 들어가면 동작을 안함.. ':' 쓰지 않는 string으로 넣어주어야 됨 2. localtime_s() 함수로 얻게 되는 time_t 시간 데이터는 월을 0 부터 계산한다. 그래서 time_t 객체의 tm_mon 변수에 +1을 해야 정상적인 '월' 값이 나온다. 3. pscp: Ubuntu 에서 Window로 파일 옮길 때 pscp로 파일을 다운로드 받을 수 있다. SSH 포트가 바뀌어있을 경우 -P 옵션으로 포트를 재지정해주어야 하며, 디렉토리를 복사할 경우 -r 옵션을 주어야 한다.
C++ CopyConstructible 1. CopyConstructible : 복사 생성가능 2. std::bind() 의 파라미터로 unique_ptr을 넘기면 에러가 뜬다. 파라미터로는 CopyConstructible 한 객체가 넘어와야 한다는 메시지였다. unique_ptr은 MoveConstructible과 MoveAssignable 속성은 가지고 있지만, CopyContructible과 CopyAssignable 속성은 가지고 있지 않기 때문이다. 반면, shared_ptr의 경우 CopyConstructible과 CopyAssignable 속성이 있기 때문에 std::bind()의 파라미터로 사용 가능하다. 그래서 unique_ptr로 선언된 변수를 shared_ptr로 선언한 후 빌드하니 정상적으로 컴파일이 완료되었다.