Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Vector oraz tworzenie obiektów klas

Ostatnio zmodyfikowano 2017-02-05 15:47
Autor Wiadomość
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.

C/C++
class aaa
{
    public
    aaa();
    ~aaa();
}
 
oraz vector który ma przetrzymywać wskaźniki do tej klasy

C/C++
vector < aaa *> Elementy;
 
Moje pytanie jest czy w właściwy sposób zarządzam pamięcią:

Tworzenie:
C/C++
Elementy.pop_back( new aaa() );
 
Usuwanie
C/C++
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
P-157335
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.
C/C++
#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() << ' ';
    }
}
P-157336
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
P-157361
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.
P-157362
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:
C/C++
#include <iostream>
#include <string>
#include <memory>

struct Base
{
    std::string name;
    int height;
    double weight;
};
void fillStruct( Base * ptr ) // wczytywaniem do struct może zająć się przeciążony operator>>
{
    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;
}
P-157363
mokrowski
» 2017-02-05 15:47:07
Dodam jeszcze że unique_ptr można oprócz move(...) czy get(), zamienić z pomocą swap(...).
P-157368
« 1 »
  Strona 1 z 1