C and C++

[C++] delete시 주의점

개발새발 2018. 1. 1. 22:12
반응형

unmanaged 언어인 c++에서 메모리 관리는 전적으로 개발자가 해야한다.

malloc이나 new로 메모리가 할당된 객체를 delete,free할 때 delete 후 NULL을 할당해 주지 않고 실수로 다시 한번 객체를 delete,free하게 된다면 segmentation fault가 발생한다.


결론적으로 template 함수로 delete와 null할당을 해주면 편할 것 같다.


#include<stdio.h>

#include<iostream>

using namespace std;

class Test{

    

};

void endProgram(Test *t){

    if(t){

        printf("endProgram object t delete\n");

        delete t;

    }

}

void readyForEnd(Test * t){

    if(t){

        printf("readyForEnd object t delete\n");

        delete t;

    }

    endProgram(t);

}

int main(void){

    Test * t1 = new Test();

    readyForEnd(t1);

    return 0;

}



해결책은 템플릿 함수로 safe delete를 만들어 두자


#include<stdio.h>

#include<iostream>


template <typename T>

void safe_delete(T& p){

    delete p;

    p = NULL;

}


using namespace std;

class Test{

    

};

void endProgram(Test *t){

    printf("endProgram object t delete\n");

    safe_delete(t);

}

void readyForEnd(Test * t){

    printf("readyForEnd object t delete\n");

    safe_delete(t);

    endProgram(t);

}

int main(void){

    Test * t1 = new Test();

    readyForEnd(t1);

    return 0;

}


*ps c++에서 delete와 free는 수행하기 전에 포인터의 NULL을 확인할 필요는 없다. 

delete,free함수 내에서 NULL check를 함.

c++에서는 매크로 함수보다는 템플릿 함수를 권장






반응형