Inicjalizacja obiektu za pomocą listy w konstruktorze innej klasy

0

Mam pytanie dotyczące inicjalizacji obiektu jakiejś klasy w konstruktorze innej klasy za pomocą listy.

Teraz robię to bez listy jak poniżej i wszystko pracuje prawidłowo:

class Foo {
    public:
        Foo(){
            bar = new Bar(12345, "string");
        } 

    private:
        Bar *bar;
};

Natomiast jak chcę to zrobić za pomoca listy (być może niepoprawnie) to kompiluje się natomiast chwilę po uruchomieniu programu rzuca mi wyjątek std::bad_alloc

Foo() : bar(new Bar(12345, "string")){}

Ewentualnie proszę o wyjaśnienie mi co robię źle. Jak to zrobić lepiej/poprawniej.

0

Pokaż cały kod, który wywołuje ten wyjątek, bo samo to nie powinno stanowić problemu: http://ideone.com/BCB9gu

0

Całego kodu to tu nie wrzucę bo jest tego sporo, a poza tym nie bardzo mogę. Postaram się natomiast przedstawić w jaki sposób to wykorzystuję.

#include <iostream>
#include <string>

using namespace std;

struct Bar
{
    Bar(int, const string&){}
    
    void function(){
        cout << "Bar" << endl;
    }
};

class Foo
{
public:
    Foo() : bar(new Bar(12345, "string")){}
    
public:
    Bar *bar;
};

class Mee
{
public:
    Mee(Foo& foo) : foo(foo){}
    
    void test(){
        //no i tutaj dalej w głąb, potrzebuję wykorzystać obiekt bar;
        foo.bar; //tutaj bardzo proste użycie, natomiast u siebie w kodzie wykorzystuję bibliotekę zewnętrzną,
                //tworzę obiekt klasy z tej bibloteki i przekazuję tam wskaźnik
        //Object obj{*foo.bar}; 
    }
    
public:
    Foo& foo;
};

int main(int argc, char** argv) {
   
    Foo foo;
    Mee mee(foo);
    mee.test();
    
    return 0;
}

Dlaczego tak?
Zarówno w Foo, jak i Mee potrzebuję mieć dostęp to tego samego obiektu Bar i korzystać z niego. Może da się inaczej. Wydumałem to tak, i działa prawidłowo do momentu kiedy nie robię inicjalizacji listą.

1

Widzę tu bałagan. Raz wskaźnik, drugi raz referencja, sugeruje że nie panujesz nad czasem życia obiektów.
Brak destruktora i konstruktora kopiującego podczas gdy jest new w konstruktorze.

Popraw kod, bo tak to nie ma sensu się zastanawiać dlaczego jest wyjątek.

0

Zamiast zwykłych wskaźników lepiej korzystać z dobrodziejstw, które daje nam "nowe C++" i używać smart pointerów.
Zamiast:

Bar *bar;

zrób:

shared_ptr<Bar> bar;

nie musisz wtedy martwić się samodzielnym zwalnianiem zasobów.

0

std::bad_alloc znaczy, że nie można przydzielić pamięci, co zwykle oznacza, że masz wyciek pamięci.
Uruchom jakieś narzędzie do sprawdzania pamięci i załataj wyciek.
valgrind, albo address sanitizer (szybsze i nowocześniejsze rozwiązanie).

1 użytkowników online, w tym zalogowanych: 0, gości: 1