Seite 1 von 1

[C++11] make_shared

Verfasst: 15.10.2011, 18:05
von kristof
Hallo Leute,

ich habe die letzten Tage begonnen mich etwas in den neuen C++ Standard einzuarbeiten, da der Clang Compiler in der Version 3.0 jetzt schon eine ganze Menge davon implementiert.
Dabei bin ich auf eine Sache gestossen, die ich nicht so ganz verstehe. Vielleicht könnt ihr mir das erklären.
Ich verwende make_shared um einen shared_ptr zu erzeugen. Dabei wird, wenn das Objekt welches ich erzeuge einen Konstruktor mit Parameterliste hat, der Destruktor scheinbar mehrfach aufgerufen. Ist das normal? Hier mal ein Beispiel:

Code: Alles auswählen

class foo
{
public:
    foo(int a) {std::cout << "foo constructor" << std::endl;}
    ~foo() {std::cout << "foo destructor" << std::endl;}
};

class bar
{
public:
    bar() {std::cout << "bar constructor" << std::endl;}
    ~bar() {std::cout << "bar destructor" << std::endl;}
};

int main (int argc, const char * argv[])
{
    auto foo_instance = std::make_shared<foo>(42);
    std::cout << "A" << std::endl;
    auto bar_instance = std::make_shared<bar>();
    std::cout << "B" << std::endl;
    return 0;
}
Die Ausgabe, die ich dabei bekomme ist:

Code: Alles auswählen

foo constructor
foo destructor
foo destructor
A
bar constructor
B
bar destructor
foo destructor
Ist das ein Bug? Ich hab momentan nur den Clang Compiler zur Verfügung um das zu testen. Wenn nicht, dann könnte das sicherlich zu Problemen führen.

Viele Grüße,
Kristof

Re: [C++11] make_shared

Verfasst: 16.10.2011, 14:41
von eXile
Visual Studio 2010 hier:

Code: Alles auswählen

foo constructor
A
bar constructor
B
bar destructor
foo destructor

Re: [C++11] make_shared

Verfasst: 16.10.2011, 15:36
von kristof
Danke fürs ausprobieren. Dann scheint das ja wirklich ein Bug zu sein. Macht ja auch überhaupt keinen Sinn sonst.

Re: [C++11] make_shared

Verfasst: 16.10.2011, 21:21
von Helmut
Es könnte sein, dass make_shared den Copyctor zweimal benutzt. Ich würde den mal auch implementieren und am besten noch bei allen Ausgaben den this Pointer ausgeben.

Re: [C++11] make_shared

Verfasst: 16.10.2011, 22:07
von kristof
Tatsache.

Code: Alles auswählen

foo constructor: 0x7fff5fbff7f8
foo copy constructor: 0x7fff5fbff870
foo copy constructor: 0x100100a18
foo destructor: 0x7fff5fbff870
foo destructor: 0x7fff5fbff7f8
A
bar constructor: 0x100100a38
B
bar destructor: 0x100100a38
foo destructor: 0x100100a18
Danke auch dir für den Hinweis. Dann ist das wohl nur ne etwas unschöne Implementierung.