Zrobiłem następujące trochę Program: (w zasadzie klasa Couts jeśli zostanie utworzony, kopiowane lub zniszczone, a głównym że robi trochę tego)std C++ zniszczenie elementu pojemnik i zachowanie wstawiania
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");
}
wyjście wygląda następująco:
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
to wydaje mi się bardzo dziwne. Dlaczego nawet kłopoczę się przekazaniem czegoś jako odnośnikiem, jeśli mimo to zostanie on skopiowany dwukrotnie? Dlaczego v1.operator = (inne) nie niszczy zawartych w nim elementów? Dobrze pasuje do zachowania shared_ptr. Czy ktoś może mi powiedzieć, dlaczego?
ADDITION kładę to w nieskończonej pętli i sprawdził wykorzystanie mem, nie wydaje się, aby produkować przeciek mem przynajmniej.
ADDITION OK, mem nie stanowi problemu, ponieważ używa operatora = zamiast ctorowania, ok, dziękuję. Kiedy dodać
v1.reserve(10);
v2.reserve(10);
numer logiczny kopii odbywa. bez tego ponownie przydziela i kopiuje cały wektor dla każdego push_back (co jest dość opóźnione nawet dla małych wektorów). Patrząc na to będę rozważyć użycie .reserve coraz zoptymalizować operatorów przypisania jak diabli :)
Ponadto: PODSUMOWANIE
- Wszystkie te kwestie wydają specyficzne dla VC++ 2005.
- Jeśli rozmiar dwóch kontenerów jest taki sam, moja implementacja używa operatora = na elementach zamiast niszczyć stare i kopiować nowe, co wydaje się być praktyką dźwiękową . JEŚLI rozmiary różnią się, stosuje się normalne zniszczenie i kopiowanie.
- Wraz z wdrożeniem z 2005 r. Należy użyć rezerwy! W przeciwnym razie fatalna, a nie stabilna wydajność.
- Te czarne skrzynki są o wiele czarniejsze niż myślałem.
Czy próbowałeś skompilować to jako kompilację wydania? – jalf
Tak. Ten sam wynik. – AndreasT
Łatwo jest się wypróbować, po prostu skopiuj wklej do pustego projektu i dodaj elementy programu iostream, wektor i ciąg znaków, i gotowe. – AndreasT