Vector oraz tworzenie obiektów klas
Ostatnio zmodyfikowano 2017-02-05 15:47
kuba7283 Temat założony przez niniejszego użytkownika |
Vector oraz tworzenie obiektów klas » 2017-02-04 17:06:35 Cześć, mam pytanie odnośnie Vector'a oraz tworzenie i usuwania obiektów klas do niego zapisanych. Mam w kodzie klasę powiedzmy aaa. class aaa { public aaa(); ~aaa(); }
oraz vector który ma przetrzymywać wskaźniki do tej klasy vector < aaa *> Elementy;
Moje pytanie jest czy w właściwy sposób zarządzam pamięcią: Tworzenie: Elementy.pop_back( new aaa() );
Usuwanie Element.erase( Element.begin() + 0 );
Teraz moje pytanie czy przed niesunięciem powinienem usunąć obiekt za pomocą delete i zwolnić pamięć? Może ktoś z forumowiczów zna lepszy sposób na zarządzanie elementami klasy. Pozdrawiam |
|
carlosmay |
» 2017-02-04 17:21:10 Teraz moje pytanie czy przed niesunięciem powinienem usunąć obiekt za pomocą delete i zwolnić pamięć? |
Tak. Użyj std::unique_ptr<> i uwolnij się od zwalniania pamięci. #include <iostream> #include <vector> #include <memory>
class A { int a; public: A() = default; A( int val ) : a { val } { } ~A() = default; int get_a() const { return this->a; } };
int main() { std::vector < std::unique_ptr < A >> a_objects; std::size_t size { 3 }; for( std::size_t i { }; i < size; ++i ) { a_objects.push_back( std::make_unique < A >( static_cast < int >( i ) ) ); } for( auto const & el: a_objects ) { std::cout << el->get_a() << ' '; } } |
|
kuba7283 Temat założony przez niniejszego użytkownika |
» 2017-02-05 11:21:44 Generalnie std::unique_ptr<> fajna sprawa lecz potrzebuję kopiować elementy które będa w vector do innego. a z tego co mi się wydaje tych wskaźników nie można kopiować
Pozdrawiam |
|
michal11 |
» 2017-02-05 11:36:38 Jeżeli chcesz kopiować czyli mieć dwa wskaźniki na ten sam obiekt to skorzystaj z std::shared_ptr. Jeżeli mieć zawsze jeden wskaźnik na dany obiekt ale go przenosić miedzy vectorami to możesz przenosić std::unique_ptr. |
|
carlosmay |
» 2017-02-05 11:43:41 Jak @michal11 wspomniał można przenosić ( std::move() ) lub wyciągać wskaźnik z klasy metodą wsk.get() . Prosty przykład: #include <iostream> #include <string> #include <memory>
struct Base { std::string name; int height; double weight; }; void fillStruct( Base * ptr ) { std::cin >> ptr->name >> ptr->height >> ptr->weight; }
int main() { std::unique_ptr < Base > basePtr = std::make_unique < Base >(); fillStruct( basePtr.get() ); std::cout << basePtr->name << ' ' << basePtr->height << ' ' << basePtr->weight << std::endl; } |
|
mokrowski |
» 2017-02-05 15:47:07 Dodam jeszcze że unique_ptr można oprócz move(...) czy get(), zamienić z pomocą swap(...). |
|
« 1 » |