💙ref.

모두의 코드 씹어먹는 C++ <3. C++ 의 세계로 오신 것을 환영합니다. (new, delete)>



1. 개요

프로그램의 메모리 힙 관리를 위해 C++에서는 newdelete 기능을 지원한다. 각각 C언어의 mallocfree에 대응한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main() 
{
  int* p = new int;		// int 크기의 공간을 할당해 주소값을 p에 대입
  *p = 10;			// p가 할당된 공간에 값 저장

  std::cout << *p << std::endl;

  delete p;
  return 0;			// 메모리에 할당된 공간 해제
}

// 실행 결과
// 10

단, new로 할당된 공간만 delete로 해제할 수 있다. 지역변수를 delete로 해제하면 런타임 오류가 발생하니 유의하자.



2. 배열 할당

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>

int main() 
{
  int arr_size;				// 배열 크기
  
  std::cout << "array size : ";
  std::cin >> arr_size;
  
  int *list = new int[arr_size];	//arr_size 크기의 int 배열 생성
  
  for (int i = 0; i < arr_size; i++) 
  {
    std::cin >> list[i];
  }
  
  for (int i = 0; i < arr_size; i++) 
  {
    std::cout << i << "th element of list : " << list[i] << std::endl;
  }
  
  delete[] list;		// 배열 해제
  return 0;
}

// 실행 결과
// array size : 5
// 1
// 4
// 2
// 6
// 8
// 0th element of list : 1
// 1th element of list : 4
// 2th element of list : 2
// 3th element of list : 6
// 4th element of list : 8
  • 배열 생성: T* pointer = new T[size];
    • new T[size] - delete[]가 쌍을 이룸



*. 변수의 유효범위

지역변수 유효범위

1
2
3
4
5
6
// ...
{
  int a = 4;
  std::cout << a;
}
std::cout << a;
  • 중괄호 밖 a 출력: 오류 발생


변수 우선순위

어떤 변수를 사용할 때, 컴파일러는 해당 변수를 가까운 범위부터 먼저 사용한다.


1
2
3
4
5
6
7
8
int a = 4;
{
  std::cout << "외부 변수 1" << a << std::endl;
  int a = 3;
  std::cout << "내부 변수 1" << a << std::endl;
}

std::cout << "외부 변수 2" << a << std::endl;
  • 출력 결과: 434

    • 처음 a로 정의된 변수는 외부 변수 a

    • 함수 내부에 a를 새롭게 정의할 경우, 외부 변수는 내부 변수에 의해 가려짐
      • 중괄호를 지나면서 내부 변수 소멸
    • 함수 외부에서 외부 변수가 유효한 영향을 미침


위 예제와 같이 같은 범위에서 동일한 변수를 선언하는 것은 허용되지 않는다.

컴파일러가 어떤 변수를 사용해야 할지 분명하지 않기 때문이다! 변수 이름을 지을 때 중복된 변수명은 사용하지 말자.

Leave a comment