[C++] new, delete

·2023년 8월 16일
0

C++

목록 보기
2/17
post-custom-banner

malloc, free 그리고 new, delete

C++에서도 C언어에서 사용한 malloc과 free를 사용하여 힙 메모리에 할당 가능
하지만, C++ 언어 차원에서 지원하는 것은 new와 delete임
new는 malloc에 대응대는 것으로 메모리를 할당하고,
delete는 free에 대응되는 것으로 메모리를 해제함

new 사용 방법
T* pointer = new T;

// new 와 delete
#include <iostream>

int main() 
{
  int* p = new int; // int 크기의 공간을 할당하여 그 주소값을 p에 대입
  *p = 5;			// 할당된 공간에 값 대입

  std::cout << *p << '\n';

  delete p;			// 공간을 해제하기 위해 delete 사용
  					// delete로 해제 할 수 있는 메모리 공간은 사용자가 new를 통해서
                    // 할당한 공간만 가능
  return 0;
}

실행 결과
10


Heap이 아닌 공간을 해제하면?

-> 경고 메시지가 표출됨

// 지역 변수 delete
#include <iostream>

int main()
{
	int a = 5;

	delete &a;
}


new로 배열 할당하기

#include <iostream>
using namespace std;

int main()
{
	int arr_size;
	cout << "array size : ";
	cin >> arr_size;

	int* list = new int[arr_size]; // 크기가 arr_size인 배열

	// i는 for문 안에서 정의됨
    // for문 밖에서는 사용할 수 없음
	for (int i = 0; i < arr_size; i++)
	{
		cin >> list[i];
	}

	for (int i = 0; i < arr_size; i++)
	{
		cout << i << "th element of list : " << list[i] << '\n';
	}

	delete[] list;
}

실행 결과
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


malloc과 new의 차이

  • malloc은 메모리를 동적으로 할당하는 것만이 목적이기 때문에 초기값 지정 불가능
    -> new는 할당과 동시에 초기화 가능
  • new는 생성자를 자동으로 호출함

(참고) 컴파일러의 변수 사용

변수를 사용할 때 컴파일러는 그 변수를 가장 가까운 범위(scope)부터 찾음

int a = 4;
{
  std::cout << "외부의 변수 1" << a << std::endl;
  int a = 3;
  std::cout << "내부의 변수 " << a << std::endl;
}

std::cout << "외부의 변수 2" << a << std::endl;

실행 결과
4
3 // scope로 범위를 달리 했으므로 int a = 4와 다른 변수임
4

post-custom-banner

0개의 댓글