한국어
Qt
 

C++ Class QScopedPointer 소개 및 사용법

makersweb 2019.11.29 20:46 조회 수 : 4434

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 118890
60 QNetworkAccessManager를 통해 HTTP POST 하는 예제 makersweb 2019.01.17 8099
59 Qt Bluetooth를 이용한 시리얼(Serial) 통신 file makersweb 2019.02.17 8172
58 Windows에서 Qt D-Bus를 사용하여 프로세스간 통신(IPC) file makersweb 2019.05.02 8304
57 Qml 기본 컴포넌트 강좌 (4) - 모델 리스팅(Listing) file 운영자 2019.02.23 8456
56 QML에서 앵커(anchors)로 위치 지정 file makersweb 2021.10.05 8565
55 열거형(enum)을 QML에서 사용하는 방법과 문자열(QString)로 얻기 makersweb 2019.08.20 8610
54 QTextCodec클래스를 사용하여 유니코드와 EUC-KR 변환 makersweb 2019.03.25 8696
53 Widgets(C++) 기반의 기본 스타일을 Dark 테마 및 Material 디자인 스타일로 바꾸기 file makersweb 2023.01.28 8727
52 Qt응용프로그램 실행 시 콘솔창(터미널)같이 띄우기 file makersweb 2019.01.16 8878
51 C++로 구현된 모델을 QML의 ListView에서 참조 file makersweb 2019.09.07 9032
50 라즈베리파이4에 대한 Qt 5.14.1 크로스컴파일 [1] file makersweb 2020.02.12 9033
49 Qml에서 키보드 입력 이벤트 핸들링 file makersweb 2018.08.09 9054
48 QString 문자열에서 숫자만 추출해서 QString으로 반환 makersweb 2017.01.10 9216
47 Qt 를 사용하거나 기반으로 하는 응용프로그램 file makersweb 2021.01.30 9302
46 멀티 스레드환경, 스레드에 안전한 이벤트처리 makersweb 2016.10.27 9315
45 Qt기반의 오픈소스 프로젝트들 makersweb 2019.05.15 9361
44 C++로 작성한 클래스를 QML에서 생성 file makersweb 2021.02.10 9482
43 Windows에서 라즈베리파이3 Qt 어플리케이션 개발 및 원격 실행 file makersweb 2018.02.23 9492
42 Qt기반의 오픈소스 프로젝트들 - 2 운영자 2019.07.21 9559
41 Windows환경에서 mingw로 Qt 5.10 정적(static)빌드 file makersweb 2018.02.01 9560