내가 젤 잘하는게, 위 3개인데...
강좌함 해보까?
사실 내가 관종이라 반응봐서 좋으면 하구 아니면 말구~~
c로 사전을 만든다고 치자. 나는 대충 이런식으로 짬.
dict_new()
dict_free()
타인이 만든 라이브러리 이용하는 것처럼 이런 걸 만들어주는 편이지. UI 코드는 분리하구.
이렇게 짜야 알아보기 쉽고, new (), free () 쌍으로 따라다니니까, 메모리 누수 실수가 극히 적음.
여기서는 그럴 일 없지만 dict 라는 것을 다른 곳에서도 쓰면
dict_new()
dict_free()
dict_ref()
dict_unref()
이렇게 만들어서 ref 로 ref_count++, unref 로 ref_count-- 이렇게 함. 이벤프 루프 돌리고 그러면
일단 dict_new() 하면 ref_count++ 해주고, 그냥 그렇게 쓰면 되는데, 다른 루프에서 어떤 함수에서
dict 를 인수(argument)로 참조할 때, 또 다른 곳에서 dict 를 해제하면 곤란한 경우가 발생할 경우,
dict_ref () 해주고, 함수 빠져나올 때, dict_unref() 해줌.
void function (Dict *dict)
{
dict_ref (dict);
...
dict_unref (dict);
}
메모리 해제 시점이 곤란한 경우가 있는데 그 때 dict_unref() 함수를 호출하면 되지.
ref_count == 0 이면 dict_free()를 호출하여 메모리 해제시키구.
밑에서는 ref, unref 쓸 필요가 없으니까.. new 한 후에 free 로 그냥 해제시켜버리구.
typedef _Dict Dict;
struct _Dict Dict
{
GtkWidget *window;
}
Dict *dict_new ()
{
Dict *dict;
dict = malloc (sizeof (Dict));
}
void dict_free (Dict *dict)
{
free (dict)
}
int main ()
{
Dict dict; /*일부러 한 줄 띄움, 이 변수는 메모리 해제되어야 함 */
dict = dict_new (); /* 위, 아래 일부러 한 줄 띄움, 이 변수는 메모리 해제되어야 함 */
gtk_init (NULL, NULL);
dict.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_main ();
dict_free (dict); /* 위에 일부러 한 줄 띄움, new, free 가 쌍을 이루었는지 눈으로 보기 쉬우라구 */
}
ㅅㅂ 급똥
오타있네 typedef _Dict Dict; typedef struct _Dict Dict;
수동 RAII
gtk_widget_show_all 도 빼먹구, destroy시그널 부착도 안 하구 ㅋㅋ 급똥이라 ㅋㅋ
C로 OOP 하다보면 나도 비슷하게 짜는듯요
gtk 배우고싶어요
좋네요
gobject로 짜고 gir로 묶는 거 보면 꼴림
gobject 로 짜면 gir scanner 툴 이용하여 gir 도 자동으로 만들어줌. 진짜 물건에 물건임!!
ㄱㄱㄱㄱ