[C++11] make_shared

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
kristof
Beiträge: 92
Registriert: 19.01.2009, 13:05

[C++11] make_shared

Beitrag 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
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: [C++11] make_shared

Beitrag von eXile »

Visual Studio 2010 hier:

Code: Alles auswählen

foo constructor
A
bar constructor
B
bar destructor
foo destructor
kristof
Beiträge: 92
Registriert: 19.01.2009, 13:05

Re: [C++11] make_shared

Beitrag von kristof »

Danke fürs ausprobieren. Dann scheint das ja wirklich ein Bug zu sein. Macht ja auch überhaupt keinen Sinn sonst.
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: [C++11] make_shared

Beitrag 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.
kristof
Beiträge: 92
Registriert: 19.01.2009, 13:05

Re: [C++11] make_shared

Beitrag 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.
Antworten