다른 함수에서 메모리를 할당한 경우 메모리가 제대로 해제되나?
글쓴이: cjy1126 / 작성시간: 목, 2005/03/03 - 4:08오후
1번 코드
#include <stdio.h> #include <stdlib.h> #include <string.h> struct A { int a; char b[30]; }; struct A *function(int *count) { int i=0; char temp[30]; struct A *test; test = (struct A *)malloc(sizeof(struct A) * 10); for(i=0; i<10; i++) { test[i].a = i*10; sprintf(temp, "temp[%d]=%d", i, i); strcpy(test[i].b, temp); } *count = i; return test; } int main() { struct A *test; int i=0; int count; test = function(&count); for(i=0; i<count; i++) printf("test[%d]: a = %d, b = %s\n", i, test[i].a, test[i].b); free(test); return 0; }
test = (struct A *)malloc(sizeof(struct A));
1번 코드 function 함수의 할당부분을 위와 같이 바꾸면 경우는 할당된 값과 return 하는 값이 같기때문에 free가 제대로 되는걸로 압니다.
test = (struct A *)malloc(sizeof(struct A) * 10);
하지만 위와 같이 할당된 값과, return 값이 다를때는 어떻게 되나요?
할당된 메모리가 모두 제대로 free가 되는가요?
아니면, test[0]의 부분인 제일 첫부분만 free되는가요?
Forums:
malloc을 호출한만큼 free를 호출하시면 됩니다.포인터만 가지고
malloc을 호출한만큼 free를 호출하시면 됩니다.
포인터만 가지고 있으면 변수는 달라도 상관없습니다.
test = (struct A *)malloc(sizeof(struct
test = (struct A *)malloc(sizeof(struct A));
나
test = (struct A *)malloc(sizeof(struct A) * 10);
똑같습니다.단지 아래것이 사이즈가 좀 클뿐이죠..메모리는 제대로 해제 됩니다..
하지만 링크드 리스트 같은 경우에는 노드마다 일일이 모두 free시켜 줘야 합니다.
아래의 코드경우 할당을 여러번 한것이 아니라 사이즈만 다른경우 이므로
아래의 코드경우 할당을 여러번 한것이 아니라 사이즈만 다른경우
이므로 한번만 호출하면 됩니다.
(test+1)...은 사용자가 사용의 편의상 변화시킨것 뿐이고 free할
때사용되지 않고 malloc할때 받은 리턴값만 free에 사용됩니다.
올려준 예제에서는 temp가 초기화가 안되었네요. 저런 경우 메모리
올려준 예제에서는 temp가 초기화가 안되었네요.
저런 경우 메모리 침범이 발생해서 대략 난감.
malloc의 함수 생김새를 보시면 답이 대략 나옵니다. malloc은 size_t 파라메터를
입력 받습니다. 원하는 크기만큼의 메모리를 할당하고 그 시작 주소를 리턴합니다.
시작 주소로 free 를 호출하면 그 주소를 갖는 malloc 된 전체가 해제 됩니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
저는 main에서 return 받은 값이struct A * 형이라
저는 main에서 return 받은 값이
struct A * 형이라서
struct A * 만큼만 free 되나하는 생각을 했습니다.
할당된만큼 한번에 제대로 다 해제된다면 코딩이 편해졌네요 ㅎㅎㅎ
답변 감사드립니다.
temp에서 어떤식으로 메모리 침범이 생기나요?
temp에서 어떤식으로 메모리 침범이 생기나요?
위소스에선 temp메모리 침범 안함.
위소스에선 temp메모리 침범 안함.
sprintf대신에.
sprintf보다는 snprintf를 사용하시는 편이
정신건강에 이롭다는 군요~
댓글 달기