Есть два объекта cServer & cClient class сServer { .... cClient** clis; pthread_t thaccept; pthread_mutex_t mxkey; int cliadd(int sd); int clidel(cClient* p); unsigned long count; .... protect: static void* waitforaccept(void* p); .... } class cClient { ...... void* parent; pthread_t thread; ....... private: static void* socketread(void* p); ....... }
cClient::cClient { ..... pthread_create(&thread,0,sockread,(void*)this); pthread_detach(thread); ..... }
static void* cClient::socketread(void* p) { ... pthread_setcanceltype(PTHREAD_CANCEL_ASYNCTONOUS,0); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,0); int sd=((cClient*)p)->getsocket(); char buf[65535]; while(1) { memset(buf,0,65535); if(recv(sd,buf,65535,0)==-1) { ((cServer*)(((cClient*)p)->getparent()))->clidel((cClient*)p); return (void*)0; } ...... } } //cliadd организован так же cServer::clidel(cClient* p) { pthread_mutex_lock(&mxkey); for(int i=0;i<cli_count;i++) { if(p==clis[i]) { delete clis[i]; for(i;i<cli_count;) { clis[i]=clis[++i]; } clis[--cli_count]=0; cClient** tmp=NULL; tmp=(cClient**)realoc(clis,cli_count*sizeof(cClient*)); if((tmp!=clis)&&(tmp!=NULL)) { clis=tmp; } } } pthread_mutex_unlock(&mxkey); } так вот после чего mcheck показывает что в realoc при уничтожении образуется неосвобожденая память и незакрыты дискриптор нити которая вызывает уничтожение объекта, хотя в деструкторе есть проверка и уничтожение потока pthread_kill;pthread_cancel;pthread_join Вот в чем вопрос, ето что realoc c нитями такое дают ???