c++

    [C++] 가비지(Garbage) & 가비지 컬렉션(Garbage Collection) / 포인터 & 메모리 동적할당

    가비지 & 가비지 컬렉션 가비지 : 포인터(p1)에 다른 포인터(p2)에 담긴 주소값을 옮겨 담아서 p1이 다른 곳을 가리키면, 원래 가리키던 메모리는 아무도 사용하지 않고 아무도 가리킬 수 없는 상태가 되는데, 이때 이 아무도 사용하지 않는 쓰레기 메모리가 가비지! 가비지 컬렉션 : 시스템 상에서 가비지 컬렉터가 이 가비지를 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것 (수동으로 직접 해제해주지 않아도 됨) cf. 댕글링 포인터 : 이미 동적 할당된 메모리를 해제했는데 여전히 가리키고 있는 포인터. p1과 p2가 한 메모리를 동시에 가리키고 있다가 그 중 한 포인터에 의해 메모리를 해제한 경우! ex. 블록 밖으로 나가면서 Mat이 자동으로 해제됐는데 포인터는 그대로 가리킬 때 포인터 대입 (..

    [C++, OpenCV] Convert Arr2Mat, Mat2Arr / 16bit(short) to 8bit(unsigned char) / CV_type

    Convert Arr to Mat short* psImage; Mat psImage_mat(nWidth, nHeight, CV_16SC1, psImage); Convert Mat to Arr short* psImage_arr = (short*)psImage_mat.data; Convert 16bit(short) to 8bit(unsigned char) normalization Mat img(row, col, CV_16SC1); // 16bit(short) Mat img_8UC1 = img.clone(); // get min, max double minVal; double maxVal; Point minLoc; Point maxLoc; minMaxLoc(img, &minVal, &maxVal, &minLo..

    [C++] 2차원 배열 동적 할당, 해제, 초기화

    💡 동적 메모리를 할당받은 포인터 변수를 할당받기 전과 해제한 후에 NULL을 대입하여 메모리 접근 오류를 방지! 💡 2차원 배열을 동적 할당으로 열었을 경우엔 다음과 같이 "초기화" 및 "할당" 후 "해제" 시켜주자! // 포인터 선언 및 초기화 short** ppsImages = NULL; // NULL로 초기화 꼭 해주고 할당 및 해제! // 메모리 할당 short** ppsImage = new short*[nHeight]; for (int row = 0; row < nHeight; row++){ ppsImage[row] = new short[nWidth]; // 각 행의 열 값들도 동적 할당 (메모리 열기) memset(ppsImage[row], 0, sizeof(short)*nWidth); //..

    [C++] 전방 선언 (Forward Declaration)

    A 클래스가 a.h라는 헤더파일에 있고, B 클래스가 b.h라는 헤더파일에 있는데 A에서도 B를 사용하고, B에서도 A를 사용할 때.. 서로 #include를 둘 다 해서 헤더 꼬임 현상이 발생하면 무한 루프에 빠지게 되는데, (컴파일 속도도 저하됨) 이 때 전방 선언 사용! 전방 선언 사용법 한 파일(ex. "b.h")에서 #include "a.h" 대신, class A; 라고 선언! cf. 참고 [c++] 클래스 전방 선언(Forward declarations)와 상호 참조 헤더 파일 class A 가 a.h에 있고 class B 가 b.h 에 있는데 B가 A를 사용하고 A가 B를 사용할 경우 : 거의 설계가 잘 못되었다고 볼 수 있다. 이렇게 프로그램을 짜면 이해하기가 힘들고 추적이 힘들기 때문에 ..

    [C++] 정적 변수(Static) vs 전역 변수(Global) , const

    공통점 (지역 변수와 달리) 프로그램이 끝날 때까지 할당된 변수의 값과 메모리가 유지됨. 차이점 정적 변수 (Static Variable) 선언된 해당 파일, 함수 내에서만 접근 가능 ==> 내부 링크 초기화는 단 한번만 가능 (소스 파일에서만 초기화 가능) 선언 시 : static 키워드를 반드시 사용해야 함 전역 변수 (Global Variable) 해당 프로그램의 모든 파일, 함수에서도 접근 가능 ==> 외부 링크 필요할 때마다 초기화를 언제든 몇번이든 가능 다른 파일에서 접근하지 않는 전역 변수 선언시에는 그냥 main 함수 바깥에 선언해주면 됨 다른 파일에서 접근하려면 extern 키워드로 변수를 선언해야 함 // 전역 변수 사용 ex (외부 링크 시) int g_value; // 본문 내 선언..