Jump to content
Sign in to follow this  
Getz

Malloc Mesti Free Ke?

Recommended Posts

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. smile.gifsmile.gifsmile.gif

Share this post


Link to post
Share on other sites

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);

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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 smile.gif.

kalau program hang ringkas, don't worry about memory deallocation..

Share this post


Link to post
Share on other sites

andaikan ko kena bukak balik buku "OS in programmers perspective"

atau http://www.google.com.my/search?q=cache:m2...%26a%3D9+&hl=en

erm.. lagi, ko nye style programming kat

char * left(char * string, int length)

{ ... }

tu kan, kureng sesuai tau.. kalau ko allocate heap memory kat fungsi

tu, nanti kalau ko nak pulangkan balik kat caller function, dia tak dapat

string 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'

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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 smile.gif

#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 smile.gif.

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...