superkind
6/29/2018 - 6:39 AM

기억공간 형식과 동적 대입

기억공간 형식과 동적 대입

float * p_fees = new float[20];

p_fees 포인터는 이 변수가 선언되어 있는 함수가 종료될 때 사라지므로 메모리의 주소를 전달할 필요(외부 링크)가 있음.

extern float * p_fees;

  • new 연산자를 이용한 초기화
int *pi = new int (6); // *pi를 6으로 초기화
double * pd = new double (99.99) // *pd를 99.99으로 초기화
struct where {double x; double y; double z;};
where * one = new where {2.5, 5.3, 7.2};
int * ar = new int [4] {2, 4, 6, 7};
int * pin = new int {6}; // *pin을 6d으로 초기화
double * pdo = new double {99.99};
  • new 가 실패하는 경우 메모리의 양을 확보할수 없을 경우, std::bad_alloc 예외를 반환한다.

  • new: 연산자, 함수, 대체함수

int * pi = new int;
int * pi = new(sizeof(int));

int * pa = new int[40];
int * pa = new (40 * sizeof(int));

예시

int * psome = new int [10];
delete [] psome;
char animal[20] = "bear";
char *ps;

ps = animal;
ps = new char[strlen(animal) + 1];
strcpy(ps, animal);
int main()
{
    char* name;    // 포인터를 만들지만 메모리는 대입하지 않는다
    
    name = getname();    // 문자열의 주소를 name에 대입한다
    cout << (int *)name << ": " << name << "\n";
    delete[] name;      // 메모리 해제
    
    name = getname(); 
    cout << (int *)name << ": " << name << "\n";
    delete[] name;
    
    return 0;
}

char * getname()        // 새 문자열을 가리키는 포인터를 리턴한다
{
    char temp[80];      // 임시 배열
    cout << "이름을 입력하십시오: ";
    cin >> temp;
    char * pn = new char[strlen(temp) + 1];
    strcpy(pn, temp);    // 문자열을 더 작은 공간으로 복사한다
    
    return pn;        // 함수가 종료될 때 임시 배열인 temp는 소멸한다
}

위치 지정 new 연산자

일반적으로, new 연산자는 사용자가 요청한 메모리 크기를 충분히 다룰 수 있을 만큼의 메모리 블록을 힙에서 찾는다. 그런데 new 연산자는 사용할 위치를 사용자가 지정할 수 있는 위치 지정 new라는 한 가지 변형이 있다. 프로그래머는 메모리 관리 절차를 설정하거나 특정 주소를 통해 접근하는 하드웨어를 다루고, 특정 메모리 위치에 있는 객체를 생성하는 데에 이 기능을 사용할 수 있다.

위치 지정 new는 각괄호와 함께 또는 각괄호 없이 사용할 수 있다.

#include <new>
struct chaff
{
    char dross[20];
    int slag;
};

char buffer1[50];
char buffer2[50];

int main()
{
    chaff *p1, *p2;
    int *p3, *p4;
    
    // new의 일반 형식
    p1 = new chaff;     // 구조체의 힙에 놓는다
    p3 = new int[20];   // int 배열을 힙에 놓는다
    
    // 위치지정 new
    p2 = new (buffer1) chaff;   // 구조체를 buffer1에 놓는다
    p4 = new (buffer2) int[20]  // int 배열을 buffer2에 놓는다
}

-> LISTING 09.10 참조


기억공간의 종류

  • 자동 공간(automatic storage) 함수가 호출되는 순간에 자동으로 생겨나 그 함수가 종료되는 시점까지만 존재함. 자동변수는 스택에 저장된다. 메모리상의 스택에 그 값이 순차적으로 저장되고, 역순으로 해제되는 것을 의미한다(LIFO). 따라서 스택은 프로그램이 실행하는 동안 늘었다 줄었다를 반복한다.
  • 정적 공간(static storage) 프로그램이 실행되는 동안에 지속적으로 존재하는 공간.
  • 동적 공간 new와 delete 연산자와 같이 융통성 있는 방법을 제공한다. 자유공간이라 부르는 메모리 풀을 관리한다. 메모리 누수를 피하려면 new와 delete연산자를 가능한 가깝게 결합하여 사용하는 습관을 들여야 함.