728x90
반응형

전체 글 326

[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

meiConfig를 이용한 기어비 설정

1. Upload Controller를 눌러 위 그림과 같은 창을 띄운 후, 해당 창의 Flash Memory를 체크하고 OK 버튼을 눌러 Parameter를 업로드한다. 2. 변경하고자 하는 모터의 Encorder를 선택한 뒤 기어비를 입력한다. 경로 : Controller/MotorList/Motor n/Encoder 0/Ratio A와 B의 값은 정수만 가능하며 작은 수 일수록 연산에 유리하다. 3. 화면 상단에 다운로드를 눌러 업로드 때와 동일한 창을 띄운다. Flash Memory를 체크한 후, OK 버튼을 클릭하면 저장된다. * meiConfig는 MEI 폴더 아래 응용프로그램들 모여 있는 폴더에 함께 있다.

산업기술/MEI 2022.07.14

[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..

[MySQL] ERROR 1231 "NO_AUTO_CREATE_USER" 해결

MySQL이나 MariaDB에서 dump파일을 restore 할 때 버전이 높거나 맞지 않는 경우 해당 오류가 발생하는 것 같다. Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'" dump를 한 파일은 MySQL 5.6 이었고 restore 하려고 하는 version은 MySQL 8.0과 MariaDB 10.6이었다. 우선 새로운 Version에는 'NO_AUTO_CREATE_USER" 옵션이 없다. 에디터로 해당 덤프 파일을 열어서 "NO_AUTO_CREATE_USER"를 삭제한다. (에디터의 모두 변경을 이용하면 편리하다.) 삭제 후에는 다음과 같은 에러가 발생했다. ERROR 1418 (HY000) : This funct..

DB/MySQL 2022.06.13

[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++] 마우스 이벤트 후킹

Windows에서 후킹을 하기 위해서 제공하는 함수들이 있다. 이것들은 모두 DLL 환경에서 제작되어야 한다. 후킹을 위한 DLL 프로젝트와 테스트를 위한 MFC 프로젝트가 필요하다. DLL 프로젝트 일전에는 후킹을 위한 함수를 만들 때에 모두 전역 변수와 전역 함수를 사용하였지만 관리하기가 쉽지 않았다. 검색하다 보니 싱글톤 클래스 형식으로 정리된 자료가 있어서 해당 방식으로 구현했다. 전역으로 작업하는 것이 간단하기는 하나 클래스 형식으로 하는 것이 관리가 더 편하다. case DLL_PROCESS_ATTACH: if (hook_mouse_callback::instance()->attach(hModule)) cout

코드/C++ 2022.05.11

[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
반응형