805
2014-05-22 04:00:46
1
동적 할당을 해준다는건 할당 된 객체를 소멸시켜야 한다는 의미이기도 합니다
할당과 소멸을 어디서 할 지를 생각하는게 좋을것같은데요
일단 할당에 대해서는 함수로 보면
dates* CreateData(int day, int month, char* a) {
dates* data = new dates;
data->day = day;
data->month = month;
int len = strlen(a);
data->a = new char[len + 1];
sprintf(data->a, a);
return data;
}
같은 함수를 사용해서 하면 될것같구요 해당 객체의 소멸은
void DeleteData(dates* data) {
delete[] data->a;
delete data;
}
이와 같이 할당 된 객체들을 소멸시켜주는 함수를 만들어 사용하면 될 것 같네요
만약 day 와 month 만 받고 a 는 다른곳에서 따로 받고싶다면 두가지 함수를 모두 수정해야 하는데
이유는 a 가 동적 할당된 상태인데 새로운 할당을 하면서 기존 할당된 메모리가 삭제되지 않을 수 있기 때문이죠
해서 위의 함수들을 약간 변형해서 다음과 같이 만듭니다
dates* CreateData(int day, int month) {
dates* data = new dates;
data->day = day;
data->month = month;
data->a = 0;
return data;
}
void SetString(dates* data, char* a) {
if (data->a != 0) {
delete data->a;
}
int len = strlen(a);
data->a = new char[len + 1];
sprintf(data->a, a);
}
void DeleteData(dates* data) {
if (data->a != 0) {
delete[] data->a;
}
delete data;
}
여기서 a=0; 이라 적힌 부분은 a가 아직 할당되지 않은 상태라는걸 명확히 표현해주는 부분인데요
이는 중복 할당 혹은 중복 제거를 하지 않기 위함입니다.
만약 a에게 무엇인가를 할당 해 주었다면 그 할당 된 주소값을 a가 저장할테지만, a가 0 이라면 아무것도 할당 되지 않은 상태라는 뜻이죠
일반적으로 a=0; 보다는 a=NULL; 을 많이 쓰는데 두개가 같은 것입니다. 요즘 나오는 툴로는 a=nullptr; 를 사용하기도 합니다.
이렇게 datas 의 할당과 소멸을 다루고 나면 다음은 holi 배열의 관리인데요..
holi 라는 배열을 사용하며 CreateData 를 없애고 DeleteData 에서 문자열만 소멸시켜준다던지 하는 방법도 있겠지만...
일단 여기선 datas 라는 객체를 할당 해줬기 때문에 holi 라는 배열 자체를 바꾸겠습니다
여기서는 현재 데이터와 다음 데이터를 연결시켜 리스트를 만들고 그 리스트를 관리하는 작업을 할건데요
일단 리스트의 항목이 될 구조체를 선언합니다
typedef struct _linkdata {
datas* data;
_linkdata* next;
} linkdata;
그리고 자료의 관리를 위한 최초 진입점과 끝점을 하나씩 선언해줍니다.
linkdata* begin = 0;
linkdata* end = 0;
이제 데이터의 관리만 하면 됩니다.
우선 데이터의 생성부분 입니다.
linkdata* Add(int day, int month) {
linkdata* link = new linkdata;
link->data = CreateData(day, month);
link->next = 0;
if (begin == 0) {
begin = end = link;
} else {
end->next = link;
end = link;
}
return link;
}
순서대로 사용할 데이터를 생성해주고, 현재 아무런 데이터가 없다면 시작과 끝을 생성된 데이터로, 어떠한 데이터가 들어있다면 해당 데이터를 마지막 데이터로 설정해주는 부분이죠
데이터의 삭제는
void Remove(dates* data) {
if (begin == 0) {
return;
}
if (data == begin->data) {
linkdata* next = begin->next;
delete begin;
DeleteData(data);
begin = next;
} else {
linkdata* iter = begin;
while (iter->next != 0) {
if (iter->next->data == data) {
linkdata* next = iter->next->next;
delete iter->next;
DeleteData(data);
iter->next = next;
break;
}
iter = iter->next;
}
}
}
정도로 하면 되겠네요..
..음... 잠자기전에 심심풀이로 살짝 만져본게 여기까지 와버렸네요...........
코드는 최대한 어려운 코드를 배제했구요..
그냥 댓글창에서 바로 적은거라 에러가 있을지도 몰라요 적당히 분석 해보며 이해를 하고 사용하는걸 권장합니다
실제 사용부분 예문으로 하나 적어두고 턴을 마치겠습니다.
#include <stdio.h>
#include <string.h>
typedef struct {
int month, day;
char *a;
}dates;
typedef struct _linkdata {
dates* data;
_linkdata* next;
} linkdata;
dates* CreateData(int day, int month);
void SetString(dates* data, char* a);
void DeleteData(dates* data);
linkdata* Add(int day, int month);
void Remove(dates* data);
linkdata* begin = 0;
linkdata* end = 0;
void main() {
linkdata* current = Add(1, 5);
SetString(current->data, "오월 일일");
current = Add(2, 5);
SetString(current->data, "오월 이일");
current = Add(3, 5);
SetString(current->data, "오월 삼일");
current = Add(20, 5);
SetString(current->data, "오월 이십일");
Remove(current->data);
current = begin;
while (current != 0) {
printf("%s, [%d월 %d일]n", current->data->a, current->data->month, current->data->day);
current = current->next;
}
current = begin;
while (current != 0) {
Remove(begin->data);
current = begin;
}
}