Beefy Boxes and Bandwidth Generously Provided by pair Networks DiBona
Just another Perl shrine
 
PerlMonks  

Re: [Win32] pthreads and memory allocation

by Marshall (Prior)
on Nov 22, 2011 at 06:20 UTC ( #939374=note: print w/ replies, xml ) Need Help??


in reply to [Win32] pthreads and memory allocation

I am having trouble understanding even the basics of this C code.
TaskCode() returns a pointer to anything and accepts a pointer to anything.

There is nothing returned from this C subroutine,
void *TaskCode(void *argument).

tid = *((int *) argument);
means: argument is "cast" as a pointer to integer.
Then that result is de-referenced to get the "tid". A **int.

The OP's code is a memory leak because there is no pointer or other way to use the memory allocated by
"s = (char*) malloc(100);".

void *TaskCode(void *argument) { int tid; char * s; tid = *((int *) argument); // tid = **argument; printf("thread %d: calling malloc\n", tid); s = (char*) malloc(100); printf("thread %d: malloc called\n", tid); return NULL; }
"s" is a memory pointer returned by malloc(). Now a malloc() call should have a conditional statement to see that it actually worked. But the big thing here is that the subroutine TaskCode() returns bullshit. I don't see how "s", the pointer to a new memory allocation of 100 bytes can ever be used outside of TaskCode()


Comment on Re: [Win32] pthreads and memory allocation
Download Code
Re^2: [Win32] pthreads and memory allocation
by syphilis (Canon) on Nov 22, 2011 at 07:22 UTC
    It's just a demo to illustrate that malloc() causes a crash on Win32 (but not elsewhere, afaik).
    Perhaps I should have declared char * useless_and_pointless; instead of char * s;.

    Now a malloc() call should have a conditional statement to see that it actually worked

    Yes, if you're wanting to make use of the memory that you've requested be allocated, I think that's a good idea. For the purposes of this demo, however, I don't really care whether the malloc succeeds or fails - I just want it to not cause a crash.
    (Besides, on Win32, I'm not even going to see the result of that "conditional statement" because it never gets executed - due to afore-mentioned crash.)

    Similarly, any memory leak is of no concern to me wrt this particular exercise.

    Cheers,
    Rob
      Yes,
      Perhaps I should have declared char * useless_and_pointless; instead of char * s;.

      Yes, I figure that would be correct and I figure that we understand each other.

      The basic issue is: "s = (char*) malloc(100);". "s" is cast as a pointer to a memory address. "s" is guaranteed to point to at least 100 bytes (consecutive).

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://939374]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (6)
As of 2014-04-20 09:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (485 votes), past polls