Sto lavorando a un'applicazione che richiede molta memoria, che dovrebbe gestire correttamente le situazioni di esaurimento della memoria.Dove vengono memorizzate le variabili catturate dalla chiusura?
ho qualcosa di simile
class memory_manager {
// returns true if slot created (and function is being run)
// false otherwise
static bool create_slot(int id, std::function<void (slot&)>); ........
}
gestisce Questa classe, tronchi, e così via tutti i problemi out-of-memory, mantiene la proprietà di tutti gli slot e le unità concorrenza.
Tuttavia, ho non gestita std::bad_alloc
il seguente codice:
slot_data_to_copy dat;
memory_manager::create_slot(100, [&dat](slot& sx) { sx.assign_data(dat); });
Si considera che il lancio è fatto durante la cattura delle variabili. (Sto catturando in realtà più di loro, questo è solo un esempio di esempio)
Dove viene creata la chiusura? Posso controllarlo? Oppure, se aggiorno il manager in un modo che ci vuole parametro, come
slot_data_to_copy dat;
memory_manager::create_slot<slot_data_to_copy>
(100, dat, [](slot& sx, slot_data_to_copy& dat)
{ sx.assign_data(dat); }
);
è garantito che non si butta a tutti?
Sto compilando entrambi utilizzando Visual C++ su Windows e GCC su Linux, ma ho osservato questo comportamento solo su Windows (su Linux, ho esaurito la memoria probabilmente da qualche parte dove posso gestirlo).
EDIT:
http://en.cppreference.com/w/cpp/utility/functional/function/function - std :: funzione contiene nothrow operatori .. Sto probabilmente manca qualcosa, ma quale è usato in questo (lambda) situazione?
'Suppongo che il lancio venga eseguito durante l'acquisizione delle variabili. '- il lambda viene copiato sull'heap? e quando viene rilasciato? – nothrow
[expr.prim.lambda]/2 "La valutazione di un'espressione lambda si traduce in un valore provvisorio. Questo temporaneo è chiamato * oggetto di chiusura *." Il ctor di 'std :: function' che è usato qui è' template < class F > function (F f); ', che è * not *' noexcept'. – dyp