Language/C++

[C++] 8.Unmanaged Programming: Instance 생성

coco_daddy 2024. 1. 23. 15:50

Instance 생성 방법

// Stack에 만들기 (Heap 보다 빠름)
Vector a;

// Heap에 만들기 (느림)
Vector *b = new Vector();

스택 메모리 간단한 설명

  • 예약된 로컬 메모리 공간(일반적으로 1MB 이하)
  • 함수 호출과 반환이 스택 메모리에서 일어난다.
  • 스택 포인터를 단순히 옮기는 것.
    • 메모리 할당 및 해제 필요 없다.
    • 스택에 할당된 메모리는 범위를 벗어나면 사라진다.
    • 변수 및 매개변수 크기는 컴파일 도중에 알 수 있다.
  • 큰 개체를 많이 넣으면 스택오버플로우가 일어날 수 있다.
    • 성능이 느려질 수 있다.

힙 메모리 간단한 설명

  • 전역 메모리 공간(크다)
  • 연속된 메모리 블록을 찾아야 한다.
  • 프로그래머가 메모리 직접 할당 및 해제
    • 메모리 누수 주의

코드 예제

스택에 생성하기

// 값에 의한 복사보다 참조에 의한 복사가 빠를 것이라는 가정.
Vector AddVector(const Vector& a, const Vector& b) 
{
    Vector result;
    result.mX = a.mX + b.mX;
    result.mY = a.mY + b.mY;

    return result;
}

void Foo()
{
    Vector c = AddVector(a, b);
}

힙에 생성하기

Vector AddVector(const Vector& a, const Vector& b) 
{
    Vector *result = new Vector;
    result->mX = a.mX + b.mX;
    result->mY = a.mY + b.mY;

    delete result; // 힙 영역 할당 해제를 해주어야 함
}

void Foo()
{
    AddVector(a, b);
}

RAII 원칙

: Resource Acquisition Is Initialization

할당과 해제를 한 스코프 안에서 해주자는 것을 지향하자는 원칙이다.

RAII in C++

 

RAII in C++

In this article, we will discuss RAII or Resource Acquisition Is Initialization approach in C++ with help of an example.

iq.opengenus.org

개체 배열 생성

Vector *list = new Vector[10];

  • 자바는 오브젝트를 스택에 만들 수 없다.
  • C++는 Vector를 담을 포인터 배열을 만들어 heap에 객체 배열을 만들 수 있다.

개체 배열 소멸

Vector *a = new Vector;
Vector *list = new Vector[10];

delete a; // 메모리 즉시 해제
a = NULL; // 댕글링 포인터

delete[] list; // []를 반드시 넣어 주어야 함
list = NULL; // 댕글링 포인터

멤버 변수 초기화

class Vector
{
    private:
        int mX;
        int mY;
};
  • 값이 초기화되지 않는다.
  • 메모리에 이전에 들어있던 값이 그대로 존재한다.