It won't hurt to try

[C++/윈도우프로그래밍응용]14. 포인터의 특수한 용법 본문

C++/윈도우프로그래밍응용

[C++/윈도우프로그래밍응용]14. 포인터의 특수한 용법

yongki.doki 2021. 10. 3. 19:22

스마트 포인터

스마트 포인터(Smart Pointer)

자동으로 동적메모리를 관리하는 새로운 C++기능

  • new 연산자 호출 후 → delete 연산자 사용 잊음
  • 동적 메모리 할당 후 메모리 반납을 잊어도
    자동으로 동적메모리를 할당하여 주는 기능

스마트 포인터의 특징과 장점

  • 동적 메모리 할당과 관련한 버그를 줄일 수 있음
  • 자동으로 nullptr로 초기화 → 메모리 오류 방지 기능

스마트 포인터의 사용 방법

#include<memory> 삽입 필요

  • 스마트 포인터를 사용하기 위해서는 memory헤더를 포함해야 사용 가능

스마트 포인터의 종류

  • unique_ptr,shared_ptr, weak_ptr
  • 사용이 간편하고 쉬운 unique_ptr에 대해서만 학습

delete 연산자 사용 불필요

unique_ptr의 사용

데이터형에 대하여 스마트 포인터를 사용하는 경우

  • unique_ptr<데이터형> <변수이름>(new <데이터형>);
  • unique_ptr<데이터형> <변수이름>(new <데이터형>[개수]);

스마트 포인터의 특징과 장점

  • unique_ptr<클래스형> <변수이름>(new <클래스형>(값1, ...));
  • unique_ptr<클래스형[]> <변수이름>(new <클래스형>[<개수>]);

사용예시

unique_ptr<int> pScore(new int);
*pScore = 100;
unique_ptr<int[]> pScore(new int[8]);
pScore[0] = 32;
pScore[1] = 64;
pScore[2] = 96;

※포인터 변수의 값의 영역에 진입하기 위해서는 포인터 변수 앞에 *를 붙여준다.

   포인터 변수(배열) 의 경우는 변수[인덱스] 로 값의 영역에 진입하는게 가능하다.

 

unique_ptr<Book> pbook(new Book(strTitle, nPrice));
pbook->print();

const 포인터

const키워드

변수의 값을 변경하지 않음을 의미

  • 예) int형의 정수를 선언 및 초기화하고 변경하지 않는 경우

컴파일러에 의해서 값의 변경을 막을 수 있음

  • 개발자 스스로 값의 변경을 막으려고 하는 경우 사용
// 주소 : 변경◯
// 값  : 변경×
const int *p;

// 주소 : 변경×
// 값  : 변경◯
int* const p;

// 주소 : 변경×
// 값  : 변경×
const int* const p;
// const로 정의된 멤버 함수에서는 멤버 변수의 변경이 불가하다.
string Book::getTitle() const
{
	return title;
}

unique_ptr을 사용한 예시

#include <iostream>
// 스마트포인터를 사용하기 위해서 불러온다.
#include <memory>
#include "book.h"
using namespace std;

int main()
{
    char strTitle[100];
    int nPrice;
    // Book* pBook = nullptr;

    cout << "책 제목: ";
    cin.getline(strTitle, 100);
    cout << "책 가격: ";
    cin >> nPrice;

    // pBook = new Book(strTitle, nPrice);
    unique_ptr<Book> pBook(new Book(strTitle, nPrice));

    // delete pBook;
    return 0;
}

 

300x250
300x250
Comments