한국어
Qt
 

C++ Class QScopedPointer 소개 및 사용법

makersweb 2019.11.29 20:46 조회 수 : 250

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; // 컴파일되지 않을 것이다.
}

 

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

대신 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 15946
108 라즈베리파이4에 대한 Qt 5.14.1 크로스컴파일 file makersweb 2020.02.12 2066
107 QOpenGLWidget 을 투명하게 적용 file makersweb 2020.02.05 273
106 2020년에 변경되는 Qt 오퍼 (Qt offering changes 2020) [2] j2doll 2020.01.31 389
105 Qt로 XML 파싱 : Qt 6에서 업데이트된 (Parsing XML with Qt: Updates for Qt 6) [1] j2doll 2020.01.16 420
104 Qt 멀티 스레드 프로그래밍 시 유의해야 할 몇 가지 makersweb 2020.01.13 1500
103 ApplicationWindow 와 메뉴바(MenuBar)구성 file makersweb 2020.01.04 398
102 QThread 소개 및 예제 makersweb 2019.12.25 4444
101 Qt의 오픈소스 라이센스 소개 file makersweb 2019.12.15 3198
100 Qt for MCU 1.0 릴리즈 makersweb 2019.12.10 357
99 Qt Marketplace 발표 makersweb 2019.12.02 344
» QScopedPointer 소개 및 사용법 makersweb 2019.11.29 250
97 QOpenVirtualkeyboard(Qt 5용 한글 및 영문, 숫자 가상키보드) file makersweb 2019.11.27 689
96 Qt3D의 QML 타입으로 3D렌더링 file makersweb 2019.11.20 722
95 라즈베리파이3에서 Boot to Qt 실행해보기 makersweb 2019.11.13 676
94 Qt애플리케이션 객체(QCoreApplication, QGuiApplication, QApplication) 에 대해서 makersweb 2019.11.11 2857
93 Qt Quick 3D 소개 makersweb 2019.11.09 520
92 QPushButton 의 커스텀 이미지버튼 file makersweb 2019.11.05 1539
91 qbs 사용 방법(Helloworld) file makersweb 2019.10.23 2061
90 웹기반 Qt Design Viewer [2] file makersweb 2019.10.23 476
89 Qt Creator에서 Qt의존성 라이브러리 자동복사하기 file makersweb 2019.10.19 606