malloc은 Heap에 변수를 할당하는 함수입니다.
또, 지정한 만큼의 메모리의 할당에 실패할경우 NULL을 리턴하죠.
그리고 이때 할당되는 공간은 Heap영역에 할당됩니다.
(Windows98 이상의 버전에서는 최대 2GB까지 할당가능합니다.)
malloc의 원형은 아래와 같구요.
void *malloc( size_t size );
사용방법은 다음과 같습니다.
#include // 여기에 malloc이 들어있죠
#include
#define STRING_SIZE 1024 // 원하는 만큼 크기를 정합니다.(Byte입니다.)
#define NULL 0
char * szString = NULL; // 원하는 형의 포인터를 만들고.
szString = (char *)malloc(STRING_SIZE); // 원하는 만큼의 메모리를 할당합니다.
if(szString == NULL) return -1; // 할당에 실패한경우 오류를 리턴
strcpy(szString,"ㅋㅋㅋㅋㅋㅋㅋ"); // 원하는 데이터를 복사 ( 문자열의 입력)
free(szString); // 변수의 사용이 모두 끝나면 꼭 해지 시켜줘야합니다.
szString = NULL; // 사용하다음 사용하지 않는 변수에 NULL을 넣어두면
// 원치않는 메모리 오류를 줄일수있습니다.
이런식으로 사용하시면 됩니다.
그런데 중요한건 char은 1byte니까 그냥 사용했는데요.
만약 Int형이나 다른형으로 할당한다면 아래와 같이 사용하셔야 합니다.
#define NUMBER_SIZE
int * nNumbers = NULL;
nNumbers = (int *) malloc(NUMBER_SIZE * sizeof(int)); // int의 크기만큼 곱해야합니다.
free(nNumbers);
그럼 즐프~
(출처 : 'malloc에 대한 자세한 설명부탁해요.' - 네이버 지식iN)
http://kin.naver.com/db/detail.php?d1id=1&dir_id=10104&eid=YpFzMyWex+BIWkVVeqURyACMYub0K2CF
http://winapi.co.kr/clec/cpp3/25-2-3.htm
동적으로 할당한 배열을 삭제할 때는 delete 대신 반드시 delete [ ] 문을 사용해야 한다. 그렇지 않았을 때 그러니까 할당은 new [ ]로 해 놓고 해제는 delete로 했을 때의 동작은 정의되어 있지 않으며(Undefined) 상황에 따라 다르다. 일반적으로 배열의 첫 번째 요소에 대해서만 파괴자가 호출되고 나머지는 파괴자가 호출되지 않으므로 메모리 누수가 발생할 것이다. 또는 할당 헤더의 구조가 달라 첫 번째 요소가 제대로 파괴되기 전에 다운될 수도 있는데 정의되지 않은 동작의 결과는 컴파일러에 따라 달라진다. 흔히 많이 실수하는 부분이므로 동적 할당한 배열은 delete [ ]로 해제한다는 것을 꼭 기억해 놓도록 하자. 중요한 내용이므로 한 번 더 반복한다. new는 delete와 짝이고 new [ ]는 delete [ ]와 짝이다.
new/delete의 가장 큰 장점은 객체가 생성, 파괴될 때 생성자와 파괴자가 호출된다는 점인데 이에 대해서는 다음에 따로 연구해 볼 것이다. 이 점만 제외하면 malloc/free와 큰 차이점은 없다. C++에서는 가급적이면 malloc/free 대신 new/delete를 사용할 것을 권장하지만 반드시 그래야 하는 것은 아니다. 단순히 메모리 할당만 한다면 malloc/free도 아직까지 쓸만하며 오히려 더 편리한 면도 있다.
예를 들어 malloc으로 할당한 메모리는 realloc으로 크기를 바꿔 재할당할 수 있지만 new에는 이에 대응하는 기능이 없어 새로 할당하여 복사하고 원래 메모리를 해제하는 과정을 직접 해야 한다. 그래서 재할당할 때마다 매번 번지가 바뀌며 심지어 축소할 때도 번지가 바뀐다. 또한 실행중에 할당 블록의 크기를 조사하는 _msize에 해당하는 기능도 없다. 할당 대상이 객체가 아니고 재할당을 빈번하게 한다면 malloc/free를 사용할 수도 있고 객체를 할당할 때는 반드시 new/delete를 써야 한다. 단, 할당, 해제 함수는 반드시 짝을 맞추어야 하며 섞어서 쓸 수는 없다. new로 할당한 메모리는 반드시 delete로 해제해야 하고 malloc으로 할당한 메모리는 free로 해제한다.
'C & C++ 관련' 카테고리의 다른 글
exit(0), exit(1) (0) | 2007.04.24 |
---|---|
realloc() 예제 (0) | 2007.04.09 |
File Copy LowLevel (0) | 2007.03.28 |