본문 바로가기

C++

(24)
C++ 면접 질문) "C++에서 Reference 와 Pointer의 차이점은?" 다음 예시 에서 30으로 변경된 값은?int a = 10;int& ref = a;ref = 30; ref 일까? 아니다. 답은 a 이다. 여기서 차이점 1. reference는 초기화 후 가리키는 대상을 변경 할 수 없다 위는 포인터라면 변경 가능하다int b = 10;int* b_ptr = &b;*b_ptr = 30;Reference는 초기화 후 대상을 변경 할 수 없다.여기서 차이점 2. 초기화 시 무조건 가리키는 대상이 정해져야 한다 가 발생한다.또한, NULL 값을 넣어 초기화 하는 것도 불가능하다.  그대신 Referece는 안전성을 갖게 된다. Nullpointer exception 이라던지, delete의 강제성이 없다.단, 가리키던 객체가 사라지면, reference는 엄한 곳을 가리키게 ..
C++ 면접 질문) delete[] 를 통해 얼마나 해제 할지 알 수 있는 이유는? metadata 개념이 있다.metadata에는 array에 몇 개의 element가 존재하는지 기록되어있다.즉, stack에 있는 메모리 포인터가 얼마나 heap에 메모리를 할당하였는지 기록하고 있다고 볼 수도 있다. 그럼 metadata는 어디에 저장될까? 예시)int* arr = new int[10]; 라고 할 때, 10 개 정수를 저장 할 공간 외 metadata를 위한 추가 공간을 할당 한다. meatadata는 new[]에 의해 반환 되는 memory address (heap) 의 앞부분에 위치하고 있다. 만약 delete[]에 의해 별도 정의한 class의 destructor가 불리는 상황이라면? metadata에 적힌 element 수만큼 destructor가 불린다.
C++) 함수를 static으로 선언 declare 한다는 것 멤버 함수를 static으로 호출 한다는 것 class instance를 만들지 않고 함수를 호출하겠다는 것 class의 static 멤버 변수만 가지고 놀려는 것 그 반면 일반 함수를 static으로 호출 한다는 것 static int getInt(int i) // 이 둘의 차이는 int getInt(int i) global 함수와는 다르게 static local 함수가 됨 이 말이란 같은 파일 내의 함수들 내에서만 static 함수를 호출 할 수 있음
C++) check whether file exists 파일 존재 여부 확인 [access(2)] 파일 존재 여부 확인 시 자주 사용하는 함수는 access 라는 함수 입니다. 함수의 정의 int access(const char* pathname, int mode) mode에는 파일의 어떤 부분을 확인 할지 전달 F_OK (파일 존재 여부) R_OK (파일 읽기 권한 여부) W_OK (파일 쓰기 권한 여부) X_OK (파일 실행 권한 여부) 함수의 반환 값 성공 시 zero 반환 실패 시 -1 반환 (errno is set) set 되는 errno 리스트 EACCES (권한 부족) ELOOP 등 사용 예제 확인 할 파일 경로 (const char *) : "/tmp/file" 확인 할 파일 부분 (int) : F_OK #include const char* file_path = "/tmp/file"; ..
C++) static 멤버 변수 life cycle class encapsulation과 관계가 있다 static 멤버 변수는 외부에서 global하게 initialize 되어야 한다. static 멤버 변수는 class 내부에서 private 하게 선언되어 있어야 효과가 있다 외부 사람들은 쓰려면 클래스에서 정의된 getter 함수를 사용하여야 한다.
C++) [스마트 포인터] weak_pointer, unique_pointer, shared_pointer unique_ponter는 이름이 말하듯이 unique 하게 한 곳에서만 해당 객체를 사용할 때 다른 곳에서는 쉽게 사용하지 못하도록 막는 smart pointer 이다. shared_pointer는 약점이 있다. A -> B를 참조하고 B -> A를 참조 할 때 메모리를 해제 할 수 없다. Scope에서 벗어나 A를 해제 하였을 때 B -> A를 참조해서 삭제 안됨. Scope에서 벗어나 B를 해제 하였을 때 A -> B를 참조해서 삭제 안됨. weak_pointer를 사용해서 위 문제를 해결 할 수 있다. B -> A shared_pointer를 이용하는 weak_pointer로 만들면 참조는 가능하지만 ref count를 증가시키지 않는다 weak_pointer는 ref count를 증가시키지 않는..
C++) Reader-Writer 문제로 본 mutex와 condition variable Mutex lock 함수로 임계 구역 (critical section) 진입 전 자신만 임계 구역에 들어가겠다고 함 unlock 함수로 임계 구역 탈출 후 다른 사람들도 임계 구역에 진입 가능하도록 만듬 Condition Variable wait 시 인자로 받은 mutex를 unlock 함 notify_one 함수로 잠자는 것들 중 하나를 깨울 수 있음 notify_all 함수로 잠자는 것들 모두를 깨울 수 있음 Reader-Writer 문제에서 mutex와 condition variable을 사용한다면 std::mutex mtx; std::condition_variable cv; int num_writers_waiting; bool writer_active; int num_readers_active; ..
C++) std::bind 와 std::placeholders (std::placeholders::_1, std::placeholders::_2, ...) std::bind std::bind를 알려면 std::function을 알아야 해요 std::function C+11에서 나온 함수 포인터로 사용 할 수 있는 std::function std::function name = &함수 이런 식으로 선언을 해요 예) std::function myFunc = &calculate; 이때 calculate는 이미 bool calculate(int, int) 라는 형식을 갖고 선언이 되있어요. 그러면 다시 std::bind를 볼께요 std::bind std::bind는 반환값이 std::function 인데요 특정 인자를 갖거나 특정 객체의 함수를 부르도록 구체적인 std::function을 제공해요 위의 예) std::function myFunc = &calculat..