한국어
Qt
 

C++ Class QScopedPointer 소개 및 사용법

makersweb 2019.11.29 20:46 조회 수 : 1037

Qt에서 제공하는 메모리 할당 및 해제를 도와주는 포인터에 대해서 간단히 알아보자.

 

QScopedPointer 는 범위를 벗어나면 자동으로 가리키는 객체를 삭제한다.

void foo()
{
    QScopedPointer<int> i(new int(42));
    ...
    if (someCondition)
        return; // int는 여기서 삭제된다.

} // 아니면 여기서 ...

 

함수의 종료 조건은 할당한 메모리를 누설하지 않는다.

 

그렇다면 포인터가 가리키는 객체에 어떻게 접근 할 수 있을까? QScopedPointer는 operator *operator-> 연사자가 구현되어있으므로 일반적인 포인터처럼 액세스 할 수 있다.

QScopedPointer<int> i(new int(42));
*i = 43;

 

할당 연산자 및 일부 연산자는 의도적으로 누락되었다. 대신 reset() 을 통해 포인터에 주소를 설정할 수 있다.

QScopedPointer<int> i(new int(42));
i = new int(43); // 컴파일되지 않음.
i.reset(new int(43)); // 문제없음. 가리키는 기존 개체(있는 경우)를 삭제하고 해당 포인터를 새로운 개체로 설정.

 

의도적으로 누락 된 또 다른 연산자는 포인터에 직접 액세스 할 수있는 연산자 T *() 이다.

int *foo()
{
    QScopedPointer<int> i(new int(42));
    ...
    return i; // 컴파일되지 않을 것이다.
}

범위가 지정된 포인터가 범위를 벗어나므로 반환하는 순간 객체가 삭제된다. 

대신 QScopedPointer에게 작업이 완료되었고 힙 객체의 소유권을 가진다는 것을 take()를 호출하여 알릴 수 있다.

int *foo()
{
    QScopedPointer<int> i(new int(42));
    ...
    if (someError)
        return 0; // 여기에서 삭제된다.
    return i.take(); // 힙에 객체가 남아 있음.
}

 

new [] 연산자 또는 malloc() 으로 할당 하는경우는 어떤지보자. 이러한 경우 해제를 정의하는 두 번째 템플릿 매개 변수를 이용한다.

QScopedPointer<int, QScopedPointerPodDeleter> pod(static_cast<int *>(malloc(sizeof int)));

QScopedPointer가 범위를 벗어난 경우 QScopedPointerPodDeleter 에서 free 된다.

 

delete [] 연산자 처럼 가리키는 객체를 삭제하는 QScopedArrayPointer 도 있다. 

void foo()
{
    QScopedArrayPointer<int> i(new int[10]);
    i[2] = 42;
    ...
    return; // 여기서 정수 배열은 삭제된다.
}

 

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 86415
79 C++로 구현된 모델을 QML의 ListView에서 참조 file makersweb 2019.09.07 4950
78 QSocketNotifier로 파일 디스크립터의 활동감지 makersweb 2019.08.28 1746
77 MCU용 Qt에 대해서 makersweb 2019.08.22 1925
76 [Qt News] Qt for Python을 위한 기술 비전 j2doll 2019.08.20 1627
75 열거형(enum)을 QML에서 사용하는 방법과 문자열(QString)로 얻기 makersweb 2019.08.20 3929
74 [Qt News] Qt 6 기술 비전 (Technical vision for Qt 6) [2] j2doll 2019.08.08 2125
73 [Qt News] Qt6 Git 개발 초기 단계 시작하기 j2doll 2019.08.02 2338
72 [Qt] Google Play의 향후 요구 사항을 준수하는 방법 [2] j2doll 2019.07.29 979
71 Qt기반의 오픈소스 프로젝트들 - 2 운영자 2019.07.21 4028
70 QML, 이미지, 폰트등을 바이너리 리소스로 만들기 makersweb 2019.06.24 3529
69 Qt Creator에서 임베디드 장치로 deploy설정(Custom Process Step) file makersweb 2019.06.15 2211
68 Qt Quick Controls 2사용 및 스타일 설정 file makersweb 2019.06.07 6290
67 QML 강좌 - 동적 Listing (ListView) file makersweb 2019.06.01 10152
66 QtInstallerFramework로 온라인 설치프로그램(Online Installer)만드는 방법 [4] file makersweb 2019.05.28 6294
65 QtCreator Design으로 GUI만들기 (QML로 만드는 Hello World -2) [1] file makersweb 2019.05.26 15037
64 QML에서 멀티 스레드(multithreading) 프로그래밍 file makersweb 2019.05.25 2678
63 QtSerialPort를 사용한 시리얼(Serial)통신 [3] makersweb 2019.05.21 12036
62 Qt기반의 오픈소스 프로젝트들 makersweb 2019.05.15 5481
61 Q_D매크로와 d-pointer file makersweb 2019.05.07 767
60 가상키보드(Qt Virtual Keyboard)를 사용하는 방법 [32] file makersweb 2019.05.03 222213