_alloca 사용상 주의점 (이글루스 예전글)
C++ 2008. 11. 27. 17:04_alloca() 는 힙이 아닌 스택에 메모리를 할당하는 함수이다.
void* _alloca(size_t size);
[주의사항]
1. 루프문 안에서 연속적으로 호출하지 말라.
_alloca 는 스택에 메모리를 할당하며, 호출 함수를 벗어나면 자동 해제되는 함수이다. 그러나, 정확히는 영역을 벗어난 시점에 바로 해제되지는 않는다.
그러기 때문에, 루프만 안에서 _alloca를 연속으로 호출할 경우, 스택 메모리 부족이 발생한다.
2. 메모리 할당 실패시에 Return Value가 NULL지로 판단하지 말라.
char* p = (char*) _alloca(0xFFFFFF); // 경고 없이 바로 프로그램 종료됨
if (p == NULL) {
}
_alloca 는 반드시 EH(SEH)와 함께 사용되여야만 메모리 할당 부족으로 인한 오류를 파악할 수 있다.(성공확신시에는 상관 없음). 따라서 리턴값이 NULL인지로 판단하는 실수를 하지 말도록 하라.
3. 윈도우즈 XP에서 컴파일 할 경우, 아래 내용을 주의 하라.
윈도우즈 XP 이고, trcy/catch 블럭 안에서 _alloca()를 호출한다면, catch 블럭 안에 반드시 _resetstkoflw()를 호출하도록 하라. 만일 사용자 throw 경우라도 _resetstkoflw를 호출하지 않는 경우, 엄청난 결과를 초래할 것이다 (버그 내용을 찾기 어렵다)
[결론]
_alloca는 될수 있으면 사용하지 말도록 하자!!
void* _alloca(size_t size);
[주의사항]
1. 루프문 안에서 연속적으로 호출하지 말라.
_alloca 는 스택에 메모리를 할당하며, 호출 함수를 벗어나면 자동 해제되는 함수이다. 그러나, 정확히는 영역을 벗어난 시점에 바로 해제되지는 않는다.
그러기 때문에, 루프만 안에서 _alloca를 연속으로 호출할 경우, 스택 메모리 부족이 발생한다.
2. 메모리 할당 실패시에 Return Value가 NULL지로 판단하지 말라.
char* p = (char*) _alloca(0xFFFFFF); // 경고 없이 바로 프로그램 종료됨
if (p == NULL) {
}
_alloca 는 반드시 EH(SEH)와 함께 사용되여야만 메모리 할당 부족으로 인한 오류를 파악할 수 있다.(성공확신시에는 상관 없음). 따라서 리턴값이 NULL인지로 판단하는 실수를 하지 말도록 하라.
3. 윈도우즈 XP에서 컴파일 할 경우, 아래 내용을 주의 하라.
윈도우즈 XP 이고, trcy/catch 블럭 안에서 _alloca()를 호출한다면, catch 블럭 안에 반드시 _resetstkoflw()를 호출하도록 하라. 만일 사용자 throw 경우라도 _resetstkoflw를 호출하지 않는 경우, 엄청난 결과를 초래할 것이다 (버그 내용을 찾기 어렵다)
[결론]
_alloca는 될수 있으면 사용하지 말도록 하자!!