Sto sempre leggendo che non dovrei lanciare un std::string
o altre classi che assegnano memoria. come here o, più importante, here al punto 3. - Non incorporare un oggetto std::string
.(non) utilizzando std :: string in eccezioni
Così ora sto cercando di inserire boost::exception al mio progetto e cosa vedo: lots of strings.
Perché la spinta non è conforme alle proprie raccomandazioni?
E se ho i parametri che non possono essere codificato, come safed in un file di configurazione, come posso mettere in un'eccezione, senza l'utilizzo di std::string
?
O è la linea guida non utilizzare std::string
solo fanno uso std::string
il meno possibile linea guida? Sono un po 'confuso ...
Ho fatto qualche ricerca. Per favore correggimi se sbaglio.
Se ho capito bene, è tutta una questione l'assegnazione durante il tiro e ciò che sta accadendo alla memoria allocata. Quindi la memoria si perde se la alloco nel costruttore e non può essere liberata nel distruttore dell'eccezione, che produrrà una perdita di memoria. Ma va bene allocarlo prima di lanciare, quindi l'eccezione è pulita.
ho provato questo:
struct xexception {
int *ttt[10];
xexception() {
ttt[0] = new int[0xfffffffL];
ttt[1] = new int[0xfffffffL];
ttt[2] = new int[0xfffffffL];
ttt[3] = new int[0xfffffffL];
ttt[4] = new int[0xfffffffL];
ttt[5] = new int[0xfffffffL];
ttt[6] = new int[0xfffffffL];
ttt[7] = new int[0xfffffffL];
ttt[8] = new int[0xfffffffL];
ttt[9] = new int[0xfffffffL];
}
~xexception() throw() {
//never happen
delete[] ttt[0];
delete[] ttt[1];
delete[] ttt[2];
delete[] ttt[3];
delete[] ttt[4];
delete[] ttt[5];
delete[] ttt[6];
delete[] ttt[7];
delete[] ttt[8];
delete[] ttt[9];
}
};
int main(int argc, const char *argv[]) {
try {
throw(xexception());
}
catch (const xexception &e) {
std::cerr << "\nttt " << e.ttt[0][0] << std::endl;
}
catch (std::bad_alloc) {
std::cerr << "bad alloc" << std::endl;
}
return 0;
}
Il risultato è, ho la bad_alloc e un enorme perdita di memoria.
Ora se eseguo l'allocazione in precedenza, è anche lancia il bad_alloc ma prima che venga creata l'eccezione.
mio eccezione al concetto eccezione è:
Chi se ne frega? Se ho un bad_alloc nel mio programma, a causa di una memory_leak o qualcos'altro (sto parlando di programmi su PC e non di microcontrollori) ho altri problemi. Forse riesco a capire che è successo un male_alloc, ma dove? Sulla mia allocazione durante una funzione (una delle forse 1000) o nello std::string
(beh so che è la stringa ma ... nessuna possibilità di manipolare la memoria della stringa ... o la sua da dissipare).
try {
// where is the error???
int *x = new int[100]; // here?
....
int *y = new int[100]; // or here?
....
int *z = new int[100];
....
int *w = new int[100];
....
int *t = new int[100];
....
int *f = new int[100];
....
std::string str("asdfasdfasdfasdfasdfasdfasdf"); // maybe here
}
catch (the error) {
....
}
E poi? Devo cercare di capire dove sta succedendo? Quindi userei valgrind non eccezioni.
void foo() {
int *i = new int[1];
foo();
}
try {
foo();
}
chatch(bad_boy) {
go_exception_handler_go(parameters); // oh, shit happens: also an stack_overflow may happend, cause stack is also full
}
O devo manipolare l'errormessage e log, che cosa definitivamente getterebbe la prossima bad_alloc.
Per favore non fraintendermi.Da quando ho visto il boost :: exception ho riscritto la mia classe di eccezione (fino ad aspettare una risposta) ma penso anche che non sia davvero necessario raccogliere ogni granello di sabbia.
Non vedo alcun 'std :: string's che sia * membri * di' eccezione'. –
'std :: runtime_error' usa un' std :: string'. –
quindi usare una stringa come parametro è ok? – user1810087