Memory LEAK with pthreads

I have this code...

#include <stdio.h>
#include <iostream>
#include <pthread.h>
static void* cliente(void *datos);

int main()
{
pthread_attr_t tattr;
int ret;
size_t size = PTHREAD_STACK_MIN + 0x0100;
ret = pthread_attr_init(&tattr);
ret = pthread_attr_setstacksize(&tattr, size);
ret= pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_JOINABLE);
ret=0;
pthread_t mythread[401];
while(ret<400)
{
int error=pthread_create((pthread_t *)&mythread[ret],&tattr,cliente,NULL);
if(error==0)pthread_detach((pthread_t)mythread);

            ret\+\+;
    \}

    while\(true\)
    \{\}

}
static void* cliente(void *datos)
{
char *buff=(char *)malloc(100000);
sleep(15);
free(buff);
buff=NULL;
pthread_exit(NULL);

}
When the code finishes I can observe that the virtual memory(report) in the creation of the threads is not liberated after doing a detach, even the memory(report) reserved also...

any body knows this problem???

TIA

Where and how are you checking memory usage? It is unclear from your message.
After the threads are created? After the program exits?

Some minor things are obvious. The unused pthread_t (401 v 400), and no call to pthread_attr_destroy() after creating the set of threads.

I see the memory usage
Before create threads... and after detach all threads in the
"while(true)
{}" is runnig...in this point the memory will be free

There are only one attr pointer... and there are too much memory used

Memory before create threads
VIRT:13556 RES: 964
Memory with pthreads create
VIRT:4649m RES:5956
Memory After thread_detach... in while(true) looping
VIRT: 4270m RES:4416

My problem is the RES memory..

Running the source before creating

0000000000400000 4K r-x-- /home/CSources/samples/thread1
0000000000600000 4K rw--- /home/CSources/samples/thread1
0000003602200000 112K r-x-- /lib64/ld-2.5.so
000000360241b000 4K r---- /lib64/ld-2.5.so
000000360241c000 4K rw--- /lib64/ld-2.5.so
0000003603200000 1328K r-x-- /lib64/libc-2.5.so
000000360334c000 2048K ----- /lib64/libc-2.5.so
000000360354c000 16K r---- /lib64/libc-2.5.so
0000003603550000 4K rw--- /lib64/libc-2.5.so
0000003603551000 20K rw--- [ anon ]
0000003603600000 520K r-x-- /lib64/libm-2.5.so
0000003603682000 2044K ----- /lib64/libm-2.5.so
0000003603881000 4K r---- /lib64/libm-2.5.so
0000003603882000 4K rw--- /lib64/libm-2.5.so
0000003603e00000 88K r-x-- /lib64/libpthread-2.5.so
0000003603e16000 2044K ----- /lib64/libpthread-2.5.so
0000003604015000 4K r---- /lib64/libpthread-2.5.so
0000003604016000 4K rw--- /lib64/libpthread-2.5.so
0000003604017000 16K rw--- [ anon ]
000000360dc00000 52K r-x-- /lib64/libgcc_s-4.1.2-20080825.so.1
000000360dc0d000 2048K ----- /lib64/libgcc_s-4.1.2-20080825.so.1
000000360de0d000 4K rw--- /lib64/libgcc_s-4.1.2-20080825.so.1
000000360f400000 920K r-x-- /usr/lib64/libstdc++.so.6.0.8
000000360f4e6000 2044K ----- /usr/lib64/libstdc++.so.6.0.8
000000360f6e5000 24K r---- /usr/lib64/libstdc++.so.6.0.8
000000360f6eb000 12K rw--- /usr/lib64/libstdc++.so.6.0.8
000000360f6ee000 72K rw--- [ anon ]
00002b292036a000 8K rw--- [ anon ]
00002b2920389000 16K rw--- [ anon ]
00007fff8a72a000 84K rw--- [ stack ]
ffffffffff600000 8192K ----- [ anon ]
total 21748K

After....

0000000000400000 4K r-x-- /home/CSources/samples/thread1
0000000000600000 4K rw--- /home/CSources/samples/thread1
0000000014a24000 132K rw--- [ anon ]
0000000041ea8000 4K ----- [ anon ]
0000000041ea9000 10240K rw--- [ anon ]
00000000428a9000 4K ----- [ anon ]
00000000428aa000 10240K rw--- [ anon ]
00000000432aa000 4K ----- [ anon ]
00000000432ab000 10240K rw--- [ anon ]
0000000043cab000 4K ----- [ anon ]
0000000043cac000 10240K rw--- [ anon ]
0000003602200000 112K r-x-- /lib64/ld-2.5.so
000000360241b000 4K r---- /lib64/ld-2.5.so
000000360241c000 4K rw--- /lib64/ld-2.5.so
0000003603200000 1328K r-x-- /lib64/libc-2.5.so
000000360334c000 2048K ----- /lib64/libc-2.5.so
000000360354c000 16K r---- /lib64/libc-2.5.so
0000003603550000 4K rw--- /lib64/libc-2.5.so
0000003603551000 20K rw--- [ anon ]
0000003603600000 520K r-x-- /lib64/libm-2.5.so
0000003603682000 2044K ----- /lib64/libm-2.5.so
0000003603881000 4K r---- /lib64/libm-2.5.so
0000003603882000 4K rw--- /lib64/libm-2.5.so
0000003603e00000 88K r-x-- /lib64/libpthread-2.5.so
0000003603e16000 2044K ----- /lib64/libpthread-2.5.so
0000003604015000 4K r---- /lib64/libpthread-2.5.so
0000003604016000 4K rw--- /lib64/libpthread-2.5.so
0000003604017000 16K rw--- [ anon ]
000000360dc00000 52K r-x-- /lib64/libgcc_s-4.1.2-20080825.so.1
000000360dc0d000 2048K ----- /lib64/libgcc_s-4.1.2-20080825.so.1
000000360de0d000 4K rw--- /lib64/libgcc_s-4.1.2-20080825.so.1
000000360f400000 920K r-x-- /usr/lib64/libstdc++.so.6.0.8
000000360f4e6000 2044K ----- /usr/lib64/libstdc++.so.6.0.8
000000360f6e5000 24K r---- /usr/lib64/libstdc++.so.6.0.8
000000360f6eb000 12K rw--- /usr/lib64/libstdc++.so.6.0.8
000000360f6ee000 72K rw--- [ anon ]
00002aaaaae7f000 4K rw--- [ anon ]
00002aeeccfe5000 8K rw--- [ anon ]
00002aeecd004000 16K rw--- [ anon ]
00007fffddab0000 84K rw--- [ stack ]
ffffffffff600000 8192K ----- [ anon ]
total 62860K

This simple sample.. have a memory leak.. why???

Why does reserved memory grow stillafter having liberated the threads?? .. should not it be able only like before having created them?

Begin program : VIRT:13560 RES:976
During trheads alive..: VIRT:510844 RES:1084
After Threads end: VIRT:120204 RES:1116

1116 ... Why?

#include <stdio.h>
#include <iostream>
#include <pthread.h>
static void* cliente(void *datos);

int main()
{
int ret;
pthread_t mythread[5];
printf("Pulsa una tecla para comenzar\r\n");
getchar();
while(ret<4)
{
int error=pthread_create((pthread_t *)&mythread[ret],NULL,cliente,NULL);
if(error==0)pthread_detach((pthread_t)mythread);

ret++;
}
printf("Fin.. pulsa una tecla\r\n");
getchar();
}
static void* cliente(void *datos)
{
char *buff=(char *)malloc(100000000);
sleep(15);
printf("Libero..\r\n");
free(buff);
buff=NULL;
pthread_exit(NULL);

}

I am confused. Why do you think memory should be freed when you detach a thread? After all the threads still belong to the process.

What OS are you on? Which particular threads library are you using?

Is Linux, The problem is that the reserved memory is growing in every new thread that is opened and is not liberated.

That is the behavour I would expect. Others have explained it in more detail to you on another forum i.e. Thread LEAK (Page 1) / Threads / UNIX Socket FAQ