Getz 0 Report post Posted January 17, 2005 A'kum,Aku ada jumpa satu function yg buat lebih kurang sama dgn function left dlm VB,char * left(char * string, int length) { char * string2 = new char[strlen(string)+1]; strcpy(string2, string); string2[length] = 0; return string2; } , Tapi aku rasa aku punya compiler tak support new operator, lgpun bukan C++.So aku ubah sikit pakai malloc mcm di bwh, char * left(char * string, int length) { char * string2 = malloc(strlen(string)+1); strcpy(string2, string); string2[length] = 0; return string2; } Tapi, problemnya , aku ada jumpa satu article yg kata, kalau pakai malloc kena free balik.Tapi aku nak letak free kat mana? takkan nak letak bawah return, mesti tak sampai.Ka;lau letak atas return pun takleh jugak..Minta tolong eehhh. Quote Share this post Link to post Share on other sites
Ancient One 3 Report post Posted January 17, 2005 mesti laa kena free.. kalau fungsi ni hang kod sendiri dan letak kat program hang, kod yang panggil fungsi ni kena call free laa..e.g: char *foo = left("test string", 4); ... free(foo); Quote Share this post Link to post Share on other sites
Getz 0 Report post Posted January 17, 2005 Oooo...TQ..TQ Quote Share this post Link to post Share on other sites
Getz 0 Report post Posted January 19, 2005 Ancient One,ada cara ke utk memastikan yg memori tu benar2 free..?Cth mcm *foo yg ko bagi tu..Ada cara ke melalui coding utk pastikan yg variable string2 yg di'malloc'kan tu dah betul2 free? Quote Share this post Link to post Share on other sites
encik pot pet 0 Report post Posted January 19, 2005 cuba debug... mesti dapat tau Quote Share this post Link to post Share on other sites
Ancient One 3 Report post Posted January 21, 2005 Ada cara ke melalui coding utk pastikan yg variable string2 yg di'malloc'kan tu dah betul2 free?tak tau.. aku just assume free buat keje dia betul2. Kalau nak confirm, create your own memory manager .kalau program hang ringkas, don't worry about memory deallocation.. Quote Share this post Link to post Share on other sites
fatah 0 Report post Posted January 23, 2005 andaikan ko kena bukak balik buku "OS in programmers perspective"atau http://www.google.com.my/search?q=cache:m2...%26a%3D9+&hl=enerm.. lagi, ko nye style programming kat char * left(char * string, int length) { ... }tu kan, kureng sesuai tau.. kalau ko allocate heap memory kat fungsitu, nanti kalau ko nak pulangkan balik kat caller function, dia tak dapatstring tu.. psal dah invalid. andaikan ko dah taruk free kat callee func sblm return..kalau ko nak free kan allocated heap tu kat caller function tu kirer boleh la jgk..tapi wat sementera, elok la wat char * left(const char *string, int length. char *res /*pass result str*/){ ... ; return ?/*reasonable valid pointer*/:NULL }lagi... c ada free() kalau malloc()c++ ada 'delete' kalau 'new' Quote Share this post Link to post Share on other sites
Getz 0 Report post Posted January 27, 2005 Oo..maksud ko result tu pass dekat var res tu lah yer? Dan tak payah returnDan function tu kalau declare as void pun takpe yer? Quote Share this post Link to post Share on other sites
Getz 0 Report post Posted January 27, 2005 Sori..ada satu lagi soalan, instead of free(), mcm mana kalau aku buat =NULL utk pointer yg di'allocate' memory pakai malloc.Cth:char *str;str=(char *)malloc(100);/* Guna str */str=NULL;Adakah itu juga akan release kan heap memory tadi? Quote Share this post Link to post Share on other sites
Ancient One 3 Report post Posted January 29, 2005 Under Windows, free actually calls HeapAlloc and immediately return. Since HeapAlloc memulangkan status kejayaan dia, kiter bleh dapatkan status ni dengan sedikit tambahan kod assembly #include <stdlib.h> int is_mem_freed; void main() { char *foo=malloc(100); free(foo); __asm mov is_mem_freed, eax } To make things easy, kiter bleh define wrapper untuk free int _free(void *blk) { int stat=1; free(blk); __asm mov stat, eax return stat; } kiter call _free instead of free #include <stdio.h> #include <stdlib.h> int _free(void *blk) { int stat=1; free(blk); __asm mov stat, eax return stat; } void main() { char *foo=malloc(100); if (_free(foo)) {printf("free() succeeded");} else {printf("free() failed");} } kalau hang ader kod crt, modify jer fungsi free ni dalam kod free.c dan jugak prototypenya dalam stdlib.h, recompile semula crt libs ngan kod baru nih... dan lupakan mengenai standard C .Sori..ada satu lagi soalan, instead of free(), mcm mana kalau aku buat =NULL utk pointer yg di'allocate' memory pakai malloc.Cth:char *str;str=(char *)malloc(100);/* Guna str */str=NULL;Adakah itu juga akan release kan heap memory tadi?JANGAN SEKALI-KALI!! c is not like any modern oop language. str hanya pegang pointer kepada allocated memory, tak lebih dari itu. biler awak assign str kepada NULL, it really does that, nothing else. Maknanya memory tu still alocated dan awak dah takde pointernya.awak nyer style takde masalah.. ia terpulang pada awak, selagi awak tau biler maser nak call free. Quote Share this post Link to post Share on other sites
Getz 0 Report post Posted January 31, 2005 TQ Bro...really helps. Quote Share this post Link to post Share on other sites