산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 메모리 관리 마스터: new와 delete 전문가 활용법

C++ 메모리 관리 마스터: new와 delete 전문가 활용법

이 가이드에서는 명확한 실전 예제를 통해 C++에서 new와 delete로 힙 메모리를 할당하고 해제하는 방법을 설명합니다.

소개

C++은 런타임에 메모리를 할당하는 동적 메모리 할당 기능을 개발자에게 제공합니다. Java나 Python 같은 관리형 언어와 달리 C++은 힙 메모리를 자동으로 회수하지 않으며, 프로그래머가 명시적으로 해제해야 합니다.

new와 delete 연산자는 이 작업의 기본 메커니즘을 제공합니다. 이 연산자들은 C++에서 수동 메모리 관리의 초석이며 C++ 표준 라이브러리에 정의되어 있습니다.


new 연산자

new 연산자는 힙에 메모리 블록을 할당하고 첫 번째 바이트에 대한 포인터를 반환합니다. 예를 들어:

// int 포인터 선언
int* pointVar;
// new로 동적 메모리 할당
pointVar = new int;
// 할당된 메모리에 값 할당
*pointVar = 45;

이 코드에서 pointVar는 새로 할당된 int의 주소를 받습니다. new가 포인터를 반환하므로 변수는 포인터 타입이어야 합니다. 배열의 경우 new는 첫 번째 요소에 대한 포인터를 반환합니다:

int* arr = new int[10]; // arr은 10개 int 배열의 첫 번째 요소를 가리킴

일반적인 문법은 다음과 같습니다:

pointerVariable = new dataType;        // 단일 객체
pointerVariable = new dataType[size];  // 배열

delete 연산자

new로 할당된 객체나 배열이 더 이상 필요하지 않으면 delete를 호출해 메모리를 운영체제에 반환해야 합니다. 이를 하지 않으면 메모리 누수가 발생해 성능 저하나 애플리케이션 충돌을 초래할 수 있습니다.

단일 객체의 경우:

delete pointerVariable;

new[]로 할당된 배열의 경우 배열 형태를 사용합니다:

delete[] pointerVariable;

완전한 생명주기 예제:

// int 할당
int* pointVar = new int;
*pointVar = 45;
cout << *pointVar; // 출력: 45
// 해제
delete pointVar;

팁: 모든 new에는 대응하는 delete(배열의 경우 delete[])를 짝지어 주세요. 실무 코드에서는 RAII나 스마트 포인터(std::unique_ptr 등)를 사용해 이 과정을 자동화하세요.


예제 1: 기본 동적 할당

#include <iostream>
using namespace std;

int main() {
    int* pointInt;
    float* pointFloat;
    pointInt = new int;
    pointFloat = new float;
    *pointInt = 45;
    *pointFloat = 45.45f;
    cout << *pointInt << endl;
    cout << *pointFloat << endl;
    delete pointInt;
    delete pointFloat;
    return 0;
}

출력

45
45.45

이 프로그램은 두 기본 타입의 할당, 대입, 출력, 깔끔한 해제를 보여줍니다.

참고: 크기가 런타임에 결정될 때 동적 할당은 유연성을 높여줍니다.


예제 2: float 배열 할당

#include <iostream>
using namespace std;

int main() {
    int num;
    cout << "학생 수 입력: ";
    cin >> num;
    float* ptr = new float[num];
    cout << "학생들의 GPA 입력." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "학생" << i + 1 << ": ";
        cin >> *(ptr + i);
    }
    cout << "\n학생들의 GPA 출력." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "학생" << i + 1 << " :" << *(ptr + i) << endl;
    }
    delete[] ptr;
    return 0;
}

출력

학생 수 입력: 4
학생들의 GPA 입력.
학생1: 3.6
학생2: 3.1
학생3: 3.9
학생4: 2.9
학생들의 GPA 출력.
학생1 :3.6
학생2 :3.1
학생3 :3.9
학생4 :2.9

프로그램은 사용자로부터 학생 수를 입력받아 해당 크기의 float 배열을 할당하고, 입력을 받아 출력한 뒤 delete[]로 메모리를 해제합니다.


예제 3: 객체 동적 할당

#include <iostream>
using namespace std;

class Student {
    int age;
public:
    Student() : age(12) {}
    void getAge() {
        cout << "Age = " << age << endl;
    }
};

int main() {
    Student* ptr = new Student();
    ptr->getAge();
    delete ptr;
    return 0;
}

출력

Age = 12

이 예제는 힙에 Student 객체를 생성합니다. 생성자가 age를 12로 초기화하고 getAge 메서드가 이를 출력합니다. 사용 후 delete로 객체 메모리를 해제합니다.

C 언어

  1. 디지털 메모리 기초: 어드레싱, 접근 방식, 휘발성
  2. C++ 변수, 리터럴, 상수 마스터하기: 종합 가이드
  3. C++ 클래스와 객체: 객체지향 프로그래밍 실전 가이드
  4. C++ 상속 접근 지정자: public, protected, private 완벽 이해
  5. C++ 프렌드 함수와 프렌드 클래스: 접근 제어 마스터하기
  6. Python 디렉터리 및 파일 관리 마스터하기
  7. C++ 구조체 vs 클래스: 임베디드 개발자를 위한 실용 가이드
  8. 라즈베리 파이 3 B+ - 업데이트된 기능, 사양 & 구매 가이드
  9. GE Digital, 예지 자산 관리 소프트웨어 공개: 유지보수를 반응형에서 사전 예방형으로 전환
  10. 위트만 바텐펠트, 프리미엄 X 시리즈와 보급형 프리무스 14 로봇 동시 출시