Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
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
Replies are listed 'Best First'.
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 imbibing at the Monastery: (14)
As of 2015-07-30 14:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (271 votes), past polls