본문 바로가기
Computing technics/C++

Delete 메모리 해제 (Malloc 에러)

by 연구실5호 2024. 10. 24.

Delete 연산자 : 동적으로 할당된 메모리 해제

 

상황 이해를 위해 간단한 코드를 짜 보았다. 날짜에 대한 component를 가지는 구조체를 선언한다. main에서 동적 할당으로 관련 변수를 선언한 후 포인터를 이용, 클래스로 넘겨준다. 클래스는 초기화된 값을 받은 후 add_days라는 함수를 이용하여 며칠 정도의 날짜를 더하고 출력한다.

 

#include <iostream>

typedef struct strDateComponent {
    int day;
    int month;
    int year;
} date_comp;

class Date {

    public:
        Date(date_comp* d);
        ~Date();
        void add_days(int n);
        void print() const;

    private:
        date_comp* today;

};


Date::Date(date_comp* d)
  : today(d)
{}

Date::~Date(){
    delete today;
}

void Date::add_days(int n){
    today->day += n;
}

void Date::print() const {
    printf("current date : %d/%d/%d\n", today->day, today->month, today->year);
}

int main(){

    date_comp* todayDays = new date_comp{5, 5, 2023};
    Date* date = new Date(todayDays);

    date->add_days(5);
    date->print();

    delete date;
    std::cout << "Size of date_comp struct: " << sizeof(*todayDays) << " bytes" << std::endl;
    std::cout << "Approch to deleted struct --> " << todayDays->day << std::endl;

    delete todayDays;
    std::cout << "Size of date_comp struct: " << sizeof(*todayDays) << " bytes" << std::endl;

    return 0;
}

 

위 코드를 보자. 여기서 sizeof 결과는 12가 나온다. int가 3개이기 때문이다. sizeof는 변수가 얼마만큼의 메모리를 차지하는지 계산하여 반환해 준다.

한편 클래스를 자세히 보면 소멸자에서 input으로 받았던 [ todayDays ] 변수의 포인터를 받은 private 변수의 메모리를 delete를 이용하여 해제한다.

구조적으로 얘기해 보자면

[ todayDays ] in main --> thorugh the pointer aruments, it will pass to the class's [ today ] variables --> In class's destructor, [ today ] is released with [ delete ] --> [ Today ] was being pointed [ todayDays ], so [ todayDays ] is released too.

따라서 위의 논리에 의해 return 위에서 delete todayDays를 하려 하면 "이중 메모리 해제"가 되어 malloc에러가 발생한다. 코드의 실행 로그를 보라.

current date : 10/5/2023
Size of date_comp struct: 12 bytes
Approch to deleted struct --> 1213218880
exe(2553,0x1ef40b240) malloc: *** error for object 0x600003484040: pointer being freed was not allocated
exe(2553,0x1ef40b240) malloc: *** set a breakpoint in malloc_error_break to debug

 

( 그와중에 동적 메모리가 해제되더라도 변수 자체에 접근은 가능하다. cout중 Approch to deleted struct 관련 로그를 살펴보라. 단지 이미 메모리가 해제되어 이상한 값이 나온다 )

'Computing technics > C++' 카테고리의 다른 글

Lambda Functions  (0) 2025.04.25
람다 함수 (lambda function)  (0) 2025.04.25