[C++] 동적할당

chxxrin·2024년 7월 24일
0

C++

목록 보기
12/22

정적 배열

정적 배열의 단점

  1. 크기를 변경할 수 없다
  2. 아주 큰 메모리를 사용할 수 없다
    -> 왜냐하면 정적배열은 미리 메모리를 잡아놓기 때문에 그 이상의 메모리를 사용하게 되면 stack overflow가 발생할 수 있다.
    -> 그래서 동적할당이 필요하다!
    char str1[] = "Hello, World!";
    char str2[kMaxStr]; // 초기화가 되지 않은 100글자가 들어갈 수 있는 배열
	// str2 = str1; // 다짜고짜 대입하면 안된다!! Error

memcpy

memcpy(복사 결과를 받을 주소, 복사 할 내용이 있는 주소, 두 개의 배열 중 더 작은 크기)
memcpy(str2, str1, Min(sizeof(str1), sizeof(str2)));
  • 두 개의 배열 중 더 작은 크기를 복사
cout << str2 << endl; // Hello, World! 
  • 제대로 복사됨!

동적할당

  • 동적 배열 : 운영체제에게 나는 이만큼의 메모리가 필요하다고 요구하는데, 필요한 전체 크기를 운영체제에게 요구함
  • char type의 데이터가 kMaxStr개 들어갈 만큼의 메모리 공간을 요청
  • 그러면 운영체제는 '여기있는 메모리 사용하게 하면 되겠다' 하고 첫번째 메모리 공간을 줌
  • 그러면 마치 배열처럼 사용할 수 있음
  • 주의: 동적할당 메모리는 변수 사이즈가 포인터 사이즈임 (배열이 아님)
  • memcpy(dynamic_array, str2, kMaxStr);
char *dynamic_array = new char[kMaxStr];
memcpy(dynamic_array, str1, Min(sizeof(str1), sizeof(kMaxStr)));

출력결과

cout << dynamic_array << endl; // Hello, World!
 cout << str1 << " " << str2 << " " << dynamic_array << endl; // Hello, World! Hello, World! Hello, World!
    cout << size_t(str1) << " " << size_t(str2) << " " << size_t(dynamic_array) << endl; // 6170522088 6170521988 5098200048

동적할당 해제 : delete[]

  • 다 사용한 메모리 혹은 더이상 사용하지 않을 메모리는 운영체제에게 반납해야함
  • 이미 운영체제는 메모리를 얼마나 줬는지 알기 때문에 굳이 메모리 크기를 적을 필요가 없다
  • dynamic_array = new char[원하는크기]; 이렇게 지우지 않고 재할당할 경우 기존의 메모리는 잃어버림
  • 그럴경우 delete[] dynamic_array; 로 다시 지워줘야 함
  • 그래서 그냥 다 쓰면 delete로 동적할당 해제를 해주는게 좋다
delete[] dynamic_array; // 배열 삭제시 []

전체코드

/*
    홍정모 연구소 https://honglab.co.kr/
*/

#include <iostream>
#include <cstring>

using namespace std;

const int kMaxStr = 100; // 전역 상수

int Min(int a, int b)
{
    return a < b ? a : b; // 조건연산자(삼항연산자)
}

int main()
{
    // 문자열 복사
    // 단점 : 크기를 변경할 수 없고, 아주 큰 메모리를 사용할 수 없다
    // 왜냐하면 정적배열은 미리 메모리를 잡아놓기 때문에(stack overflow 발생 가능)
    char str1[] = "Hello, World!";
    char str2[kMaxStr]; // 초기화가 되지 않은 100글자가 들어갈 수 있는 배열

    // str2 = str1; // 다짜고짜 대입하면 안된다!! Error

    // dest, src 안내 (복사할 메모리 크기 주의)
    memcpy(str2, str1, Min(sizeof(str1), sizeof(str2))); // 두 개의 배열 중 더 작은 크기를 복사 
    cout << str2 << endl; // Hello, World! 

    // 동적 배열 : 운영체제에게 나는 이만큼의 메모리가 필요하다고 요구하는데, 필요한 전체 크기를 운영체제에게 요구함
    // char type의 데이터가 kMaxStr개 들어갈 만큼의 메모리 공간을 요청
    // 그러면 운영체제는 '여기있는 메모리 사용하게 하면 되겠다' 하고 첫번째 메모리 공간을 줌
    // 그러면 마치 배열처럼 사용할 수 있음

    char *dynamic_array = new char[kMaxStr];

    // 주의: 동적할당 메모리는 변수 사이즈가 포인터 사이즈임 (배열이 아님)
    memcpy(dynamic_array, str1, Min(sizeof(str1), sizeof(kMaxStr)));
    // memcpy(dynamic_array, str2, kMaxStr);
    cout << dynamic_array << endl; // Hello, World!

    cout << str1 << " " << str2 << " " << dynamic_array << endl; // Hello, World! Hello, World! Hello, World!
    cout << size_t(str1) << " " << size_t(str2) << " " << size_t(dynamic_array) << endl; // 6170522088 6170521988 5098200048

    // 보통 크기를 별도로 저장함

    // 다 사용한 메모리 혹은 더이상 사용하지 않을 메모리는 운영체제에게 반납해야함
    // 이미 운영체제는 메모리를 얼마나 줬는지 알기 때문에 굳이 메모리 크기를 적을 필요가 없다
    delete[] dynamic_array; // 배열 삭제시 []

    // 지우지 않고 재할당할 경우 잃어버림
    // dynamic_array = new char[원하는크기]; 
    // delete[] dynamic_array; 다시 지워줘야 함

    return 0;
}

출처 : 홍정모 유튜브

0개의 댓글

관련 채용 정보