3월, 2019의 게시물 표시

C++ 상속시 소멸자에 virtual?

시작 C++ 상속시 소멸자에 virtual 을 주의깊게 써야한다. 분명히 어디선가 본 글과 코드가 기억납니다. 소멸자에 virtual 을 반드시 써야하는 경우가 있다는 점이 매우 인상적이라 뇌리에 남아있었고, 이 기억때문에 큰 사고(?)를 막은 적도 있어서 정리해두기 위해 글을 남깁니다. 문제 문제를 만들어내는 상황을 설계해보도록 하겠습니다. Class A Class B : A 상속 B 객체 생성 A로 캐스팅 a 소멸 B로 만들었으니 A로 캐스팅해도 B로 소멸? A로 캐스팅하였으니 A로 소멸? 그럼 B가 가진 것들은 어떻게? 물론 5.1 상황이라면 얼마나 편리하겠습니까만 그럴리가 없죠. 그러니 A로 소멸하고 B일때 가진 것들은 반납되지 않는 문제가 발생합니다. 예를 들어 메모리누수라던가 리소스를 반납 안하던가..생각만해도 끔찍하군요. 코드는 다음과 같습니다. class A { public:     A() { cout << "Constructor A" << endl; }     ~A() { cout << "Destructor A" << endl; } }; class B : A { public:     B() { cout << "Constructor B" << endl; }     ~B() { cout << "Destructor B" << endl; } }; int main(int argc, char* argv[]) {     B* b = new B;     A* a = (A*)b;     delete a;     return 0; } 결과는 다음과 같습니다.  $ ./a.out Constructor A Constructor B Destructor A Destructor B가 호출되지 않는 중요한 문제를 발생시킵니

책소개 : CERT C 프로그래밍

이미지
잡설 알라딘에 갔다가 우연히 집어든 책입니다. "안전한"이라는 문구가 눈에 띄어 보안 관련 이야기인가?하고 지나치려다 문득 목차를 보자마자 한탄했습니다. 이 책을 왜 이제 알게 되었을까? 코딩 자신감 코딩을 하거나 Code Review 할때마다 정말 괜찮은걸까? 라며 확신이 들지 않는 순간이 많습니다. 물론 그것을 보완하기 위해 서로 Code Review를 하고 있죠. 어느새 제가 Code Review를 해야하는 위치에 올라왔고 후배 개발자들의 Code Review해주고 있습니다만, 이건 아니다 라고 자신있게 말하지 못하는 경우가 많습니다. 나도 확신이 안드는데 어떻게 남의 코드를 리뷰해줄까요. 추천 일단 목차만 봐도 추천하고 싶어집니다. | 2장 | 전처리기(PRE) PRE00-C. 함수형의 매크로보다는 인라인이나 정적 함수를 사용하라 PRE01-C. 매크로에서는 매개변수에 괄호를 사용하라 PRE02-C. 매크로로 치환될 영역은 반드시 괄호로 둘러싸야 한다 PRE03-C. 타입 인코딩 시 매크로 정의 대신 타입 정의를 사용하라 PRE04-C. 표준 헤더 파일 이름을 재사용하지 마라 ~하지마라 ~하라. 고민할 시간을 없애주는군요. 물론 생각없이 무조건 따라야한다는 것은 아닙니다. 내것으로 만들어야겠죠. 하지만 이 책의 서문에도 나와있듯이 C나 Posix 공헌자들이 관여된 내용이므로 아마 거의 따라해도 될 것 같습니다. 한동안 이 책에 빠져지내야겠네요. CERT C++, Java Programming 물론 CERT 홈페이지에  C++ , JAVA 도 CERT 프로그래밍 가이드가 있습니다. JAVA는 번역 되어있는데 아쉽게도 C++은 번역된 책이 없나봅니다. C++ 은 아무래도 원서로 봐야할 것 같습니다. 링크 CERT Programming 공식 홈페이지 에이콘 출판사 CERT C 프로그래밍 한빛 미디어 CERT 자바 프로그래밍

C++ explicit 이란?

잡설 회사 코드를 뒤적거리다 explicit 키워드를 봤을때 학부때 명시적 선언이라고 배웠던 기억을 겨우 꺼냈습니다. 다만 중요하게 여기지 않았던 기억이 있어, 그대로 지나치며 한번 정리하자고 생각해두었습니다. 그렇게 기억의 한 구석에 치워두고 확인해볼 생각조차 하지 못했는데, 다시 그 코드를 보았을때 이번에는 정확하게 무엇인지 정리해두어야겠다고하여 이제 정리해둡니다. explicit이 나온 이유? explicit으로 검색했을때 가장 먼저 나온 이야기는 cpp 컴파일러가 자동으로 형변환을 한다는 것입니다.  #include <iostream> #include <string> class Test { private:     int _val; public:     Test(int val) : _val(val) {}     std::string to_string() { return std::to_string(_val); } }; void print(Test test) {     std::cout << test.to_string() << std::endl; } int main(int argc, char* argv[]) {     int val = 1024;     print(val);     return 0; } 컴파일 및 실행 $ g++ -std=c++11 explicit.cpp $ a.out 1024 됩니다! print 함수는 분명히 Test를 받도록 되어있는데 int val을 넘겨줘도 됩니다!  ... 네 몰랐습니다. 경력으로 딱지쳤나봅니다. explicit 여기서는 Test 클래스가 별달리 하는 일이 없지만, 만약 여러가지 일을 한다면 문제가 될 것입니다. 그래서 이런 경우를 방지하기 위해 명시적으로 생성자에 explicit 키워드를 붙여주면 컴파일 과장에서 에러가 발생합니다. class Test { private:     int _val; public:     expli

1080P CCTV 녹화 시간 계산

이미지
결론 아래 주저리주저리 말 많은데 다 읽기 귀찮을테니 결론만 이야기하겠습니다. 보통 1테라 HDD를 FHD 카메라 1개가 대략 11일이면 다 채웁니다. 잡설 DVR 을 수년간 개발해오면서 여러 스펙에 대한 이야기는 많이 해왔지만, 사실 1TB HDD당 며칠간 녹화할 수 있는지에 대한 계산은 해보질 않았습니다. 그도 그럴것이 스펙만 건네주면 알아서 계산하는 프로그램이 있었고, HDD를 모두 채우기에 대략 어느정도 시간이 걸린다는 경험에 따라 필요한 경우 녹화해버렸기 때문입니다. 그러다 문득 정확한 계산을 해보고 싶다는 생각으로 구글링을 해보았더니, 설치업자나 물리 보안 제품 판매 사이트의 자료들이 의외로 꽤 많이 나왔습니다. 그만큼 관련 내용을 찾는 사람이 많다는 뜻이겠고, 그런 계산조차 해보지 않았던 안일한 제 자신을 반성하게 되었습니다. 당연히 CCTV, DVR, NVR 제조사 홈페이지에 자사 제품들의 정확한 계산기를 제공하고 있습니다. 그래서 저희 회사 사이트에 들어가서 용량 계산기를 통해 계산해보았고, 의외로 계산이 너무 쉬운데 그걸 안하고 있었나 한심한 생각이 들었습니다. 계산 각설하고 이제 계산해보겠습니다. 1080P? FHD? 2MP?  1080P, FHD, 2MP 셋다 각각의 의미가 있고 히스토리가 있지만 저도 그냥 마구 섞어씁니다. 하지만 셋 모두 FHD라고 말하는 1920x1080 의 해상도를 가진 CCTV를 뜻합니다. 예전에야 D1(720x480)이나 960H(960x480) 카메라를 썼지만 이젠 FHD가 기본 사양이 되었으니 이를 기준으로 설명하겠습니다. 쉽게 설명하고자 FHD 카메라 한개당 8Mbps 녹화를 한다고 가정하겠습니다. (다른 변수는 다 제외하겠습니다. 단순하게 계산하고 나서 변수를 추가해야 이해가 쉽더군요.) 8 bits = 1 Byte 8 Mbits = 1 MBytes bps = bit per second 8bps = 1 Byte per second 8Mbps = 1 Mega

이 블로그의 인기 게시물

WSL2 Ubuntu 20.04 및 네트워크 설정

git pull 을 했더니 branch가 갈라지는 경우

리눅스 멀티코어를 사용하는 tar 압축/해제