ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 메모리 동적할당 및 해제 ( new & delete )
    C++ 언어 2020. 3. 26. 15:31

    C 에서 할당은 malloc 함수와 해제는 free 함수를 사용하여 런타임에 메모리를 추가적으로 동적 할당하여 사용한다. 하지만 C++ 에서는 메모리 동적할당시 함수를  Call 하여 메모리를 할당하는 방식이 아닌 연산자를 사용하여 추가적인 메모리를 할당한다. 이때 사용하는 연산자가 new, delete 연산자이다.

     

    new 연산자

    new 연산자가 하는 역할은 malloc 함수와 동일하다. 프로그램이 동작 중 일때 추가적인 메모리 사용 또는 기존의 stack 메모리의 크기를 벗어나는 큰 규모의 자료를 다룰 때 heap 영역의 메모리를 사용하여 데이터를 읽고 쓴다 이때 heap 메모리를 사용할 수 있게 해주는 것이 malloc 함수이다.

    // HelloNew_C+.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
    //
    
    #include "stdafx.h"
    #include<iostream>
    #include<cstdio>
    #include<string>
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int n = 0;
    	std::cout << "How old are you ? " << std::endl;
    	std::cin >> n;
        
    	// malloc 사용 메모리 동적할당 
    	int* mal_arr = (int *)malloc(sizeof(int)*n);
    	for (int i = 0; i < n; ++i){
    		*(mal_arr + i) = (i + 1) * 10;
    	}
    	for (int i = 0; i < n; ++i){
    		std::cout << *(mal_arr + i)<< std:: endl;
    	}
    	free(mal_arr);
    
    	// new 연산자 사용 메모리 동적할당
    	int* new_arr = new int[n];
    	for (int i = 0; i < n; ++i){
    		*(new_arr + i) = (i + 1) * 10;
    	}
    	for (int i = 0; i < n; ++i){
    		std::cout << *(new_arr + i) << std::endl;
    	}
    	delete[] new_arr ;
    	return 0;
    }

    위의 코드를 가지고 malloc 함수와 new 연산자의 차이를 보자면 다음과 같다.

    malloc & free new & delete

    malloc 함수의 경우 매개 변수로 동적할당 받을 메모리의 크기를 기술한다.

    만약 배열일 경우 해당 배열의 크기를 기술한다.

    해제 할 경우 해당 배열의 주소 (포인터) 를 free 함수의 매개변수로 넘겨주어 해제한다. 

    new 연산자의 경우 메모리의 크기를 기술할 필요 없이 동적 할당 받을 메모리의 자료형만 기술한다.

    만약 배열일 경우 " [ ] " 를 사용하여 배열의 크기를 기술한다.

    해제 할 경우 만약 배열 형태로 즉 "[ ]" 을 사용하여 동적할당 한 경우 delete [] (주소) 형태로 해제한다.  즉 배열로 동작 할당한 경우에는 배열 형태로 동적 해제한다.

    추가적으로 new 연산자는 내부적으로 malloc 함수를 호출한다. 하지만 이때 malloc 함수와 new 연산자는 많이 다르며 그중 가장 큰 차이점은 " new 연산자는 객체의 생성자를 호출하며 delete 연산자는 객체의 소멸자를 호출한다. " 이와 같은 차이를 꼭 기억하자

    'C++ 언어' 카테고리의 다른 글

    함수 템플릿과 인라인 함수  (0) 2020.03.30
    참조자의 내부 동작  (0) 2020.03.27
    참조형과 포인터  (0) 2020.03.26
    C++ 의 변수 선언  (0) 2020.03.26
    C++ ( std::cout ), ( std::cin ), (std::string)  (0) 2020.03.26

    댓글

Designed by Tistory.