2010-05-04 1 views
0

나는 event_box와 함께 사용자 이름을 설정하기 위해 을 사용하고 있습니다. 그래서 콜백에서 event_box 포인터로 얻을 수 있습니다.사용자 이름을 전달하기 위해`g_object_set_data` 사용하기

g_object_set_data(G_OBJECT(event_box), "user_name", (gpointer)(user_name)); 

하지만 문제는 내가 포인터를 할당 한 문자열이 아닌 user_name을 설정하고 있다는 것입니다.
로컬 문자열 (엉덩이에 할당되지 않음)이 삭제됩니다.

포인터를 할당 한 다음 사용해야합니다.이 이벤트 이름과 하나의 이름 만 연결하면됩니다.

답변

6

다음 코드를 사용합니다.

+0

고마워, 그것은 매력처럼 일했다! 그리고 메모리 누출없이 :) – User7723337

2

예, GObject에 저장된 데이터는 일반 포인터 일 뿐이므로 메모리 관리를 수행 할 수 없습니다.

문자열에 g_strdup()을 호출하고 결과를 저장하십시오. 문자열이 힙에 복제하고 event_box가 파괴 될 때 복사가 자동으로 해제 얻을 것이다

g_object_set_data_full (G_OBJECT (event_box), 
         "user_name", 
         g_strdup (user_name), 
         (GDestroyNotify) g_free); 

이 방법 :

+2

하지만 무료로 제공되는 것은 무엇입니까? 루프에서이 EventBox를 생성합니다. 할당 된 문자열을 삭제할 위치는 어디입니까? – User7723337