Ho fatto il seguente piccolo programma: (fondamentalmente una classe che Couts se viene creato, copiato o distrutto e una principale che fa alcuni di che)std C++ elemento contenitore distruzione e comportamento inserimento
class Foo
{
public:
Foo(string name): _name(name)
{
cout << "Instance " << _name << " of Foo created!" << std::endl;
};
Foo(const Foo& other): _name(other._name)
{
cout << "Instance " << _name << " of Foo copied!" << std::endl;
};
~Foo()
{
cout << "Instance " << _name << " of Foo destroyed!" << std::endl;
}
string _name;
};
int main(int argc, char**argv)
{
Foo albert("Albert");
Foo bert("Bert");
{
vector<Foo> v1, v2;
system("PAUSE");
v1.push_back(albert);
system("PAUSE");
v2.push_back(bert);
system("PAUSE");
v1 = v2;
system("PAUSE");
}
system("PAUSE");
}
L'output è il seguente:
Instance Albert of class Foo created!
Instance Bert of class Foo created!
Press any key...
Instance Albert of class Foo copied!
Instance Albert of class Foo copied! // why another copy?
Instance Albert of class Foo destroyed! // and destruction?
Press any key...
Instance Bert of class Foo copied!
Instance Bert of class Foo copied!
Instance Bert of class Foo destroyed!
Press any key... // v1=v2 why did the albert instance not get destroyed?
Press any key...
Instance Bert of class A destroyed!
Instance Bert of class A destroyed!
Press any key... // there's still an albert living in the void
Questo mi sembra molto strano. Perché mi preoccupo anche di passare qualcosa come riferimento se viene copiato due volte lo stesso? Perché v1.operator = (other) non distrugge gli elementi che contiene? Si adatterebbe bene con il comportamento di shared_ptr. Qualcuno può dirmi perché?
OLTRE Ho messo questo in un ciclo infinito e controllato l'Utilizzo memoria, non sembra produrre una perdita mem almeno.
OLTRE Ok, il mem non è un problema perché utilizza operatore = piuttosto che la copia ctor, ok grazie. Quando aggiungo
v1.reserve(10);
v2.reserve(10);
il numero logico di copie avviene. senza di ciò si rialloca e copia l'intero vettore per ogni singolo push_back, (che ritengo abbastanza ritardato anche per i vettori di piccole dimensioni). Guardando a questo mi prenderà in considerazione utilizzando Prenotate una di più e ottimizzare i miei operatori di assegnazione Col cavolo :)
AGGIUNTA: SINTESI
- Tutti questi problemi sembrano specifica a VC++ 2005.
- Se la dimensione dei due contenitori corrisponde, la mia implementazione utilizza l'operatore = sugli elementi invece di distruggere quelli vecchi e copiare quelli nuovi, che sembra pratica audio . SE le dimensioni differiscono, vengono utilizzate la normale distruzione e copia.
- Con l'implementazione del 2005, si deve usare la riserva! Altrimenti prestazione abissale e non standard.
- Queste scatole nere sono molto più nere di quanto pensassi.
Hai provato a compilarlo come una build di rilascio? – jalf
Sì. Stesso risultato – AndreasT
È facile provarsi, basta copiare incollare in un progetto vuoto e, aggiungere include di iostream, vettore e stringa, e andare. – AndreasT