Dove si trova la memoria dinamica associata a std :: bind?

1

Il problema è che poiché puoi usare std: bind in un ciclo con un numero arbitrario di iterazioni, la memoria non può essere in linea. Non sembra essere in pila, dal momento che non sembra generare perdite di memoria. Sembra, quindi, che debba essere in pila: ALCUNE pile. Ho un'applicazione che potrebbe facilmente fare centinaia di migliaia di questi collegamenti che configurano le chiamate a un utente dell'infraus. Dal momento che il chiamante potrebbe presumibilmente andare fuori campo mentre la minaccia è ancora in funzione, e dal momento che l'Infisyser ha bisogno del binding fino a quando non esegue il lavoro, tali informazioni devono essere memorizzate SOMEWHERE. Dove si trova e come lo pulisco quando i legami hanno raggiunto il loro scopo?

Esempio:

std::function<void()> *Jobs;  
Jobs = new std::function<void()> Jobs[nJobs];  
for (i=0; i<nJobs; ++i)  
{  
    Jobs[i] = std::bind (funtion, args, ...);  
}  
ThreadPool->QueueJobs (Jobs, nJobs); // store POINTERS to jobs  
ThreadPool->WaitForCompletion();  
delete Jobs;  

Sembra che funzioni?

    
posta Bruce 26.10.2015 - 05:08
fonte

1 risposta

3

Il valore di ritorno di std :: bind è interamente in pila. Se hai appena chiamato std :: bind e non hai fatto nient'altro con esso, esso si troverà in pila e poi scomparirà quando sarà uscito dall'ambito.

Per fare qualcosa di utile con il risultato di std :: bind devi averne fatto esplicitamente o implicitamente una copia, probabilmente in qualche posto nell'heap.

Ad esempio, se hai fatto questo:

std::function foo(std::bind(this, "yellow"));

Il std::function copierà il risultato di std::bind nell'heap. Quando viene distrutto std::function , verrà automaticamente rilasciata la memoria per la copia.

Se hai fatto qualcosa del tipo:

vector_of_function.push_back(std::function(std::bind(this, "yellow")));

La std::bind verrà copiata nell'heap allocata da std::function e la std::function verrà copiata nell'heap allocata da std::vector . Ma in nessun caso devi preoccuparti perché il vettore e la funzione si occuperanno della deallocazione quando vengono distrutti.

La regola in C ++ è che qualunque cosa tu sia new devi delete . Poiché la libreria standard è responsabile per new delle copie in questi casi, la libreria standard sarà delete di esse.

    
risposta data 26.10.2015 - 17:19
fonte

Leggi altre domande sui tag