C++ 의 동적할당에 대해서

linuxqna의 이미지

먼저 간단하게 코드를..

char* test(int n) {
    char* str;
    str = new char [n];
    return str;
}

int main() {
    char* a = test(10);
    strcpy(a, "Test");
    cout << a << endl;
    delete [] a;
}

위와같이 test() 함수내의 지역변수 포인터로 str이 선언이 되었고
동적할당으로 메모리를 할당받고, 포인터를 리턴해서
main()에서 쓰게됩니다.

궁금한것은
*str이 test()안의 지역변수인데,
test()가 return될때, 할당받았던 메모리 영역이 해제되지 않나요 ?
아니면 new()로 동적할당받은것은 지역이건 전역이건
delete 할때까지 남아있기때문에
위의 사용이 올바른것인가요?

bugiii의 이미지

test 함수 안의 str 포인터 변수는 new [] 로 할당 받은 주소를 담고 있는 변수입니다. new [] 로 할당 받은 것 자체와 그 주소 값을 담는 str 변수는 별개 입니다. 주소를 담는 (값으로서) 변수일 뿐입니다. 그러므로 test 안에서 delete [] 하지 않는다면 그 주소를 main 에서 사용하고 나중에 delete [] 하시는 것은 올바른 사용법입니다.

다만, new / delete 는 실수할 여지가 있어서 다른 방법을 통해서 사용하시는 것이 좋다고 생각합니다. 예를 들어 auto_ptr 의 새로운 용법이나 vector 등을 이용하는 것이 일반적으로 더 낫다고 생각합니다.