728x90
반응형

Program Language 192

MFC에서 OpenCV 사용 시 메모리 누수 해결

Lib를 만들고 테스트를 하는데 계속해서 메모리 누수가 생겼다. 메모리 누수가 생길 만큼 복잡한 코드도 아닌데 여지없이 발생한다. 특정 Lib을 포함하면 생기고 제거하면 안 생긴다. 그런데 또 그것만 따로 테스트하면 안 생겼다. 귀신이 곡할 노릇. 이래저래 오전을 다 보낸 뒤 OpenCV를 제거하니 모든 것이 정상이 되었다. 이런 경험은 처럼이라 구글링 해보니 그런 경우가 있다고 한다. 이것은 OpenCV 라이브러리가 로딩되는 시점과, MFC 공용 DLL이 로드되는 시점에 충돌이 발생될 수 있다하여 OpenCV lib을 지연 로딩해야 한다는 것이다. 그래서 지연 로딩에 등록 후 실행하니 메모리 누수가 해결되었다. 참 별일이다. 이런 것 해결하는 분들은 엄지척.. ^^

[C++] wifstream/wofstream 한글 인식 문제

ifstream과 ofstream의 경우에는 한글을 읽어오는데, wide char의 경우에만 한글 인식이 안되었다. 그래서 검색해보니 로컬 지정을 해야 한다고 한다. 아마 unicode로 저장하지 않아서 인 것 같기도 하다. 그래서 지정하고 실행해보니 잘된다. wofstream wofs; wofs.imbue(std::locale("kor")); wofs.open(_filepath); _tsetlocale(LC_ALL, _T("Korean")); 이 녀석을 추가해줘야 하는데, ANSI에서만 제대로 동작한다. UTF-8로 저장하면 또 못 읽어온다. 그냥 Unicode로 작업할까 싶기도 하지만, 우선 급해서 이렇게 해결한다.

[C++] unary_function, binary_function

unary_function은 하나의 인수로 함수 객체를 작성하기 위한 기본 클래스다. binary_function은 두 개의 인수로 함수 객체를 작성하기 위한 기본 클래스다. operator() 정의하지 않기 때문에 파생 클래스가 이를 정의해야 한다. class name_equal1 : public unary_function { string name_; public: name_equal1(const string name) : name_(name) {} bool operator()(const string& var) const { return name_ == var; } }; class name_equal2 : public binary_function { public: bool operator()(const..

[C++] string 공백 문자 제거

string에서 특정 문자를 제거하려면 erase 함수를 사용해야 한다. 좌측 문자열을 제거하기 위해서는 erase ( 시작 위치, 개수)를 사용하고, 우측 문자열을 제거하기 위해서는 rease (크기)를 사용한다. text.erase(0, npos); text.erase(npos); 특정 문자를 제거하기 위해서는 해당 문자가 아닌 위치를 우선 찾아야 한다. 이때 좌측부터 찾을 때에는 find_first_not_of를 우측부터 찾을 때에는 find_last_not_of를 사용한다. npos = text.find_first_not_of(' '); npos = text.find_last_not_of(' '); 두 함수를 이용하여 좌측, 우측 공백 문자를 제거해보자. string text(" shared pt..

[C++] shared_ptr의 잘못된 사용

smart_ptr를 익히고 나서 꾸준히 unique_ptr와 shared_ptr를 사용하였다. 그 후 프로그램을 종료할 때마다 메모리 액세스 에러가 자주 일어났다. 자동으로 메모리를 해제해 준다고 하여 스마트 포인트를 사용하였는데 오히려 문제가 더 생겼다. shared_ptr의 경우 소멸될 때 아무도 사용하고 있지 않다면 메모리를 자동으로 해제해 준다. 하지만 참조자로 받아서 shared_ptr로 변경해서 사용한다면 메모리를 두 번 해제하는 경우가 발생한다. #include #include #include using namespace std; void printf(string* ptext) { shared_ptr shrd_text(ptext); cout c_str()

[C++] 디버깅 모드 종료 시 메시지

프로그램을 종료하다 보면 다음과 같은 메시지를 만나게 된다. The program '[1528] ????????.exe' has exited with code 2 (0x2). 메모리 릭으로 골머리를 앓다보면 해당 메시지를 만나는 것만으로도 화들짝 놀라게 된다. 자라 보고 놀란 가슴 솥뚜껑보고 날라는 심정이랄까. 분명 메모리 릭을 가리키는 메시지도 있다. 정리를 해둘 필요는 있을 것 같다. The thread ??? has exited with code 0 (0x0) : Dialog IDOK, IDCANCEL을 이용하여 정상적으로 종료한 경우 The program '???.exe' has exited with code 2 (0x2) : Dialog 의 X 버튼을 사용하여 종료한 경우 The program ..

[C++] Dll Unloading 시 Kernel32.dll 에러

Dll을 LoadLibrary 이후, 프로그램을 닫을 때 Kernel32.dll 쪽에 access violation error 가 발생한다. 특정 Dll은 발생하고 또 특정 Dll은 발생하지 않는다. App - implicit Link - Explicit Link로 구성했는데, 프로그램 종료를 진행하면 App Closing 보다 Dll이 먼저 닫혀 버리는 것 같다. 소멸자의 FreeLibrary를 주석 처리하니 제대로 동작한다. 그리고 찾아보니 dll은 스스로 unloading 할 수 있는 방법이 없다는 것이다. FreeLibrary를 사용하면 래퍼런스 카운트가 0이 되어 FreeLibrary는 성공하지만 리턴하는 영역이 이미 해제된 영역이라 crash가 발생하게 된다는 것이다. 몇 시간 헤매고 또 하나..

[Python] google-webdriver error 해결

우선 selenium을 설치하고 chromedriver를 다운로드하였지만 에러가 사라지지 않았다. Version도 바꿔보고 혹시 몰라 webdriver_manager로 설치해 보았지만 에러가 해결되지 않았다. WebDriverException : Message: unknown error: Chrome failed to start: exited abnormally. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed..

[Python] pyautogui 설치 에러

Python을 공부하다가 pyautogui라는 오픈 소스에 들어가는데 이 모듈이 설치가 제대로 되질 않는다. 정확히 말하면 설치는 되는데 import pyautogui만 하면 엄청난 에러가 난다. 웹상에 존재하는 설치 에러나 모듈이 없다는 에러가 아니었다. File "", line 1, in File "/Users/connorgooch/Library/Python/2.7/lib/python/site-packages/pyautogui/__init__.py", line 249, in import mouseinfo File "/Library/Python/2.7/site-packages/mouseinfo/__init__.py", line 100, in from rubicon.objc import ObjCClass..

[C++] 자료형 타입 확인하기

C++의 자료형을 확인할 필요가 있을 때가 있다. 템플릿을 이용하여 특정 자료형에 따라 다른 작업을 할 때도 사용할 수 있다. 굳이 알지 않더라도 많은 작업들을 해낼 수 있지만 가끔씩 생기는 답답함에 테스트를 해서 정리를 해 두었다. C++ STL에서 제공하는 typeid()를 사용하면 쉽게 알아낼 수 있다. #include "stdafx.h" #include #include using namespace std; int main() { void* v; int i; long l; double d; float f; cout

[C++] GetProcAddress가 nullptr을 Return 할 때,

기존에는 아무 생각 없이 잘 되었기 때문에 신경 쓰지 않았는데, 오늘 테스트 중에 계속 nullptr가 리턴되어서 난감했다. DLL에는 아래와 같이 만들어 주고 extern "C" __declspec(dllexport) int __get_string(string* str); extern "C" __declspec(dllexport) int __disp_string(); Main에는 아래와 같이 해 두었다. int main() { HMODULE hmodule = LoadLibrary(L"DllCommon.dll"); if (hmodule != NULL) { using FUNC_DISP = int(*)(); FUNC_DISP func = (FUNC_DISP)GetProcAddress(hmodule, "__d..

[C++] template를 이용하여 Bind 사용하기

bind를 사용하면 함수의 매개변수를 미리 지정하여 사용할 수 있다. 여기서 한 가지 주의할 점은 바인드로 보내는 참조자(&)는 값을 다시 가져오지 못하였다. 그래서 포인트로 강제하니 값을 얻어 올 수 있었다. int test_func(int in, shared_ptr out) { *out = in + 100; return *out; } int main() { shared_ptr out(new int); // 바인드 사용하기 auto f(bind(test_func, 10, out)); f(); cout

[MFC] Control의 Style 비교하기

MFC에서 Control들의 기능을 변경하기 위해서 CustomDraw를 하다 보면 Control을 속성을 확인해야 할 때가 있다. 그중에서도 특히 Style에 대한 비교가 필요한데 GetStyle()로 받을 수 있는 Style 옵션은 GetStyle()에서 Return 받은 값으로 바로 비교가 불가능하다. 스타일을 비교하려면 아래와 같은 작업이 필요하다. UINT nButtonStyle = GetWindowLong(m_hWnd, GWL_STYLE) & 0x0000000F; if (nButtonStyle == BS_GROUPBOX) { ... } } MFC에서 사용하는 스타일은 아래와 같다. 자신이 필요한 스타일을 비교하여 Control을 Customizing 하는 데 사용할 수 있다. MFC에서 사용하..

[C++] Queue Clear

std::queue의 경우 clear를 제공해주지 않는다. 결국 size만큼 pop 해서 들어내야 한다. while(!q.empty()) q.pop(); 다른 방법으로는 빈 queue와 바꿔치기를 하면된다. queue empty; swap(q, empty); swap을 사용하려면 algorithm을 include 해야 한다. 그리고 새로운 방법으로 queue를 재선언해도 된다. q = queue(); How do I clear the std::queue efficiently? I am using std::queue for implementing JobQueue class. ( Basically this class process each job in FIFO manner). In one scenario, ..

[C++] condition_variable에서 unique_lock

thread 사이에 동기화를 할 때 lock을 잡는 것으로 가장 많이 사용되는 것은 lock_guard다. 소멸과 동시에 unlock을 해주기 때문에 자동으로 lock을 해제할 수 있기 때문이다. 편하지만 lock_guard는 오직 생성자, 소멸자를 통해서만 lock을 다룰 수 있다. unique_lock은 lock_guard에 몇 가지 추가적인 기능이 있다. lock을 획득하는 시점을 미룰 수 있고 lock을 잡기 위해 무한 대기하지 않아도 된다. lock을 획득하는 순서를 보장해주기도 한다. unlock 함수도 호출할 수 있다. coditional_variable은 조건을 만족하지 않으면 무한 대기하지 않고 thread를 바로 block 한다. thread가 block 되면 다른 thread로 넘어가..

728x90
반응형