본문 바로가기

C++ Core Guidelines19

[C++ Core Guidelines] I.11 원시 포인터(T*) 또는 참조(T&) 로 소유권을 넘기지 말자 I.11: Never transfer ownership by a raw pointer (T*) or reference (T&) 이유함수를 호출하거나 함수에서 결과를 반환할 때 누가 해당 데이터의 소유권을 책임지고 있는지 제대로 신경쓰지 않으면 메모리 릭을 일으키거나 실수로 미리 소멸자를 부르는 일이 발생할 수 있습니다.  예시 (나쁜 예)// 나쁨 : 이 함수만 보고는 X 를 누가 책임지고 지울지 알 수가 없습니다.X* compute(args){ X* res = new X{}; // ... return res;} 반환된 X는 누가 삭제할 것인지 의도를 알 수 없습니다. 포인터 대신 참조를 반환하면 문제를 발견하기 더 어렵게 만듭니다.위 경우 차라리 값으로 결과를 반환하는 것이 낫습니다. .. 2024. 12. 10.
[C++ Core Guidelines] I.10 예외를 사용해 필수 작업의 실패를 알리자 I.10: Use exceptions to signal a failure to perform a required task 이유에러를 무시하고 그냥 코드가 실행되게 놔두면 예상하지 못한 동작을 일으킬 수 있습니다.에러의 정의는 함수가 원래 달성해야 할 목적을 이루지 못했음을 의미합니다.  예시 (나쁜 예, 좋은 예)// 나쁨 : 음수를 반환해서 에러가 났음을 알립니다.int printf(const char* ...);// 좋음 : 새로운 스레드를 생성할 수 없을 경우 system_error 예외가 발생됩니다.templateexplicit thread(F&& f, Args&&... args);  알아두기만약 UNIX 의 시그널 헤더에서 제공하는 errno 처럼 에러 코드를 지원하는 경우, 이를 사용해도 무방.. 2024. 9. 12.
[C++ Core Guidelines] I.9 템플릿으로 만든 인터페이스는 concepts 문법을 사용해서 구체화하자 I.9: If an interface is a template, document its parameters using concepts 이유인터페이스를 구체적으로 작성하여 컴파일 타임에 조건을 검사할 수 있도록 만드는 것이 좋습니다.  예시 (좋은 예)// C++20template requires input_iterator && equality_comparable_with, Val>Iter find(Iter first, Iter last, Val v){ // ... 대략 이터레이터의 first 에서 last 까지 탐색하면서 v 값을 검출하는 코드 ...}Generic porgamming 과 Concepts 문법에 대한 내용을 참고할 수 있습니다.  정리1. requires 문법을 이용하면 템플릿 파.. 2024. 7. 5.
[C++ Core Guidelines] I.7, I.8 완료 조건을 명시하자 I.7: State postconditionsI.8: Prefer Ensures() for expressing postconditions 이유실수로 잘못된 결과를 반환하는 것을 막을 수 있습니다.  예시 (나쁜 예)int area(int height, int width) { return height * width; } // 나쁨사각형의 넓이를 구하는 함수를 만들었습니다.다만 전제 조건 검사를 생략했기 때문에 height 와 width 값으로 음수가 들어올 수도 있습니다.그것 뿐인가요? height * width 결과가 int 로 표현할 수 있는 최대값 보다 크다면 오버플로우도 발생합니다.  예시 (좋은 예)int area(int height, int width){ auto res = height .. 2024. 5. 27.
[C++ Core Guidelines] I.5, I.6 전제 조건을 명시하자 I.5: State preconditions (if any)I.6: Prefer Expects() for expressing preconditions 이유함수의 인자로 전달될 값들은 제약사항 (전제 조건) 이 있어야 하는 경우가 많습니다.   예시 (나쁜 예)double sqrt(double x); // x 는 반드시 양수여야 합니다위와 같이 제곱근을 구하는 함수가 있는데 x 가 양수여야만 계산이 가능하다고 가정한다면, C++ 의 타입 시스템만으로는 실수로 x 로 음수가 전달되는 것을 막을 수 없습니다. (참고로 unsigned double 자료형은 없습니다)주석은 쉽게 무시되기도 합니다.  예시 (좋은 예)double sqrt(double x) { Expects(x >= 0); /* ... */ }이상.. 2024. 5. 17.
[C++ Core Guidelines] I.4 명확한 타입을 사용해서 인터페이스를 만들자 I.4: Make interfaces precisely and strongly typed 이유잘 정의된 타입은 훌륭한 문서입니다. 가독성을 높이고, 컴파일러가 타입이 정확히 쓰였는지 검증할 수도 있고, 쉽게 최적화 할 수도 있습니다. 예시 (나쁜 예)void pass(void* data); // void* 가 뭔지 이 코드만 보고는 의미를 알 수 없습니다pass() 함수를 부를 때 함수의 정의만 보고는 정확히 어떤 타입의 포인터를 전달해야 하는지, *data를 수정하는지도 알 수 없습니다. 모든 포인터 유형은 암시적으로 void*로 변환되므로 실수로 다른 포인터를 전달하기도 쉽습니다.또한, 함수 내부에서 data 를 사용하기 위해 void* 를 보다 정확한 타입으로 static_cast 해야 하는데.. 2024. 5. 9.