힙을 스택처럼 사용하기. 각종 팁모음
2007/03/21 12:01
http://blog.naver.com/cjzzz/35674217
http://www.debuglab.com/knowledge/stackdynamic.html
디버그랩에서 퍼왔습니다. 한번 참고들 하세요.
스택에 동적으로 메모리 할당하기
1.요약
스택에 동적으로 메모리 할당하기란 이렇습니다.
동적이라는 것은 new, malloc 처럼 할당하는 크기를 동적으로 대입할 수 있다는 의미이고,
스택에.. 라는 것은 배열처럼 스택에 자리잡기 때문에 따로 delete, free 해줄 필요가 없다는 의미입니다.
2.본문
_alloca 라는 CRT 함수가 바로 그 일을 해줍니다.
사용법은 예제에 나오는 것 처럼 평범합니다.
그러므로, 여기서는 _alloca의 간단한 구현원리와 의점을 알아보도록 하죠.
일단 _alloca는 함수가 아닙니다 - 함수라면 stack에 공간을 확보할 수가 없다는 점은 당연하겠죠?
그냥 매크로 정도로 생각하시면 됩니다.(매크로도 아닙니다)
_alloca 가 해주는 일은 단순히 stack pointer를 필요한 만큼 감소시켜서 공간을 확보하는 일입니다. 그 확보된 공간의 시작주소(stack pointer의 값이겠죠?)를 반환하는게 전부입니다.
--------------------------------------------------------------
_alloca는 USES_CONVESION; 하면 생각나는 그 문자열 컨버전 매크로들이 사용하고 있는 그것입니다.(A2W, OLE2T, ...)
그렇게 때문에 다음과 같은 점을 주의해야 하겠습니다.
1. 매크로를 사용해 변환한 문자열을 함수 밖으로 내보내서는 안된다( return, 이나 포인터 타입의 인자를 통해서)
2. loop 안에서 매크로를 사용하게되면 계속해서 스택 포인터를 증가시키므로 스택 오버플로우가 발생할 염려가 있습니다.
그리고 스택에 밀접한 연관을 가지고 있는 구조적인 예외 처리를 사용하실 때도 다음과 점을 주의해야 하겠습니다.
1. __except(_alloca()) 처럼 예외 필터에서 사용 금지
2. __finally(_alloca()) 처럼 종료 처리기에서 사용 금지
3. C++의 catch 에서 사용 금지
3.예제
#include <malloc.h>
int main(int argc, char* argv[])
{
int n = 30;
char* p = (char*)_alloca(n);
// p는 해제할 필요가 없습니다.
return 0;
}
- 2001.08.19 Smile Seo -