MSVC C++ 전처리만 수행하기

C++ 레딧에 테스트코드 라이브러리중에 ddoctest가 있다구 해서 한번 사용해보았다. 해당 깃 링크는 https://github.com/onqtam/doctest 이다. 예제 코드는 다음과 같다 하지만 막상 TEST_CAST랑 CHECK의 구현부를 확인할려고하면….. 다음과 같은 코드를 볼수있다. 매크로의 최대의 단점중 하나인데 이는 컴파일 옵션을 주어서 어느정도 해결할수 있다. 바로 /p옵션인데 자세한것은 다음의 링크를 참조해주자. https://docs.microsoft.com/ko-kr/cpp/build/reference/p-preprocess-to-a-file?view=vs-2019 여튼 이옵션을 주고 컴파일하게되면 더보기…

Visual Leak Detector을 이용한 메모리 누수 탐지법

C++을 하다보면 어쩔수 없이 생기는 것이 메모리누수입니다. 물론 최근에는 스마트포인터같은게 있다고 하지만 아직도 어쩔수없이 동적할당을 스마트포인터를 통해서 할당을 하지않습니다. 그러다보니 메모리누수는 당연시 여깁니다. 이를 방지하기 위해 C++ msdn에서도 메모리누수를 확인하는법에 관해 적혀있습니다. 하지만 이와 별개로 좀더 자세히 알고싶을때가 있습니다. 그래서 여러 메모리누수탐지 라이브러리가 있는데 대표적으로 Visual Leak Detector입니다. 해당 라이브러리는 더보기…

카이사르 암호 (C++)

시저암호라고 불리는 카이사르 암호입니다. 아주 옛날에 만들어진 암호로 알고리즘은 a부터 z까지 원형큐에 있다고 생각하면 쉽게 풀수있습니다. 코드는 다음과 같습니다. C++ 챌린지 문제를 풀다가 나온문제인데 이게 암호화 라고해야하나…

condition_variable 조건변수 주의점

C++의 condition_variable을 보게되면 아래의 코드가 나오는데 매번 cv.wait가  신경이 쓰였다. 일단 아래의 코드를 보자 논리적으로 보면 cv.wait의 두번째 인자가 있는이유가 딱히 없다는걸 알수있다. 헌데 왜 이코드가 들어갈까 이는 해당문서를 자세히 보면 알수있다. 위에 잘보면 이는 spurious wekeup라는 문서가 있을것이다.  이게 위키피디아에도 있는데 해당 문서를 잘보면 모든 OS에서 발생한다고 한다. https://en.wikipedia.org/wiki/Spurious_wakeup  깨우지않았는에도 더보기…

Redis 코드 삽질기(1)

이글은 redis 코드에 기여하기위해 간단한 리뷰이다.  시작시 initServer함수에서 코드의 일부분이다. 잘보면 ServerCron을 1초마다 실행시킨다.  해당 함수를 잘보면 서버가 동시접속과 리플리케이션 함수를 볼 수있게 구현이 된걸 볼수있다. ServerLog라는 함수가 있다. 이 함수는 redis의 자체적인 로그함수로 각각의 레벨이 존재한다.  이를 LL_NOTICE로 바꾸고 실행시켜보면 아래와 같이 출력된다. 참고로 listLength함수는 양방향 리스트 구조체의 길이를 더보기…

스레드로 인한 메모리 시각화

스레드의 메모리영역의 읽기 쓰기 수정 같은 작업을 시각화 해주는 온라인 서비스를 발견하였습니다. 사이트는 http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/ 해당 프로그램은 모든 교차 실행을 판단하고 각 스레드를 시각해주는 역할을 합니다. 메모리 모델에 대해서는 다음의 링크를 참조해주시기 바랍니다. 해당툴로 스레드를 정의할려면 삼중 중괄호를 해주고 그안의 작업에 대해 정의를 할려면 괄호를 해주면됩니다. 일단 간단하게 두개의 스레드를 만들고 data 더보기…

C++ 두개중에 작은수를 유연하게 구하기

c++하면서 std::min을 사용하는데 이 함수의 문제는 min의 아규먼트의 타입이 같아야 합니다. 이러한 문제때문에 위의 C++ template 책에서는 이를 해결할려고 많은 시도를 보여줍니다.  결과적으로 막땅한 방법을 보여주지않고 max나 min의 함수를 이용해서 템플릿을 설명해줍니다. 결국 저만의 코드를 만들어 이를 해결해 볼려고했습니다. 코드는 다음과 같습니다. 메타 프로그래밍을 좀 이용하였습니다.  원리는 비교할려는 타입의 크기를 더보기…

std::visit와 std::variant을 이용한 오버로딩

이 내용은 대부분은 https://www.bfilipek.com/2018/09/visit-variants.html 을 참조하였습니다. std::variant 클래스는 간단히 정의하자면 안전한 union 버전이라고 볼수있다. union의 최대의 단점은 타입의 값을 집어넣었을때 해당값이 int,string 알수 없다.이 단점을 회피하기위해 C++ 17에는 std::variant 클래스가 추가되었다.자세한 설명은 보자. http://occamsrazr.net/tt/323 https://en.cppreference.com/w/cpp/utility/variant std::visit함수는  std::variant 클래스에 담겨있는 타입에 맞는 operator을 호출을 해주는 함수이다. 자세한건 아래의 코드를 보자 1 2 더보기…

Visual Studio C++ 17 사용하기

Visual studio 2017에서 C++ 17문법을 쓰게 되면 컴파일이 아래와 같은 에러가 출력된다. Severity Code Description Project File Line Suppression State Error C1189 #error: class template variant is only available with C++17. ConsoleApplication1 c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.14.26428\include\variant 16 이는 말그대로 Visual Studio 2017에서 아직 C++17문법이 가능하지않다는 것이다. 하지만  en.cppreference.com 에 더보기…

효율적으로 디버깅하기 SEH와 minidump

다음과 같은 소스 코드가있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <iostream> #include <Windows.h> #include <chrono> #include <mutex> #include <DbgHelp.h> int main() {     try {         int* A = NULL;         *A = 100;     }     catch (… ) {         std::cout << “hello world” << std::endl;     } } Colored by Color Scripter cs auto;”>이 예제는  access violation의 한 예이다. 해당 예제를 더보기…

글쓴이 kudwafter,