2016-05-17 17 views
0

ich den folgenden Code haben:Initialise unique_ptr in der Einheit testet

class foo { 

    public: 
     foo(); 
     void setMean(std::shared_ptr<std::valarray<double>> input); 
    private: 

     std::shared_ptr<std::valarray<double>> mean; 

} 

Die .cpp Datei:

foo::foo() : mean(nullptr) { 
} 

void foo::setMean(std::shared_ptr<std::valarray<double>> input){ 
    mean = input; 
} 

Jetzt, in der Unit-Test-Datei:

std::shared_ptr<std::valarray<double>> input = std::make_shared<std::valarray<double>>(std::initializer_list<double>{0.0, 0.0}); 

std::unique_ptr<foo> meanObj; 

meanObj->setMean(input); 

Der Code bricht, wenn die Steuerung innerhalb setMean Funktion geht.

Gibt es ein Problem mit der Initialisierung des unique_ptr?

+2

wo initialisieren Sie 'MeanObj'? – 101010

+1

es gibt kein foo-Objekt irgendwo tatsächlich – lsbbo

+0

Warum brauchen Sie sogar ein 'unique_ptr'? Mach einfach 'foo meanObj; meanObj.setMean (Eingabe); ' – Kevin

Antwort

3

Die letzten zwei Zeilen Ihrer Beispiel neu geschrieben Roh-Zeiger verwendet werden, wäre

foo* meanObj = nullptr; 
meanObj->setMean(input); 

Haben Sie das Problem? Sie deneferenzieren nullptr. Sie müssen zuerst ein foo Objekt erstellen, dass die unique_ptr

auto meanObj(std::make_unique<foo>()); 
// or std::unique_ptr<foo> meanObj(new foo); 
meanObj->setMean(input); 
+0

Danke für die Antwort. Aus irgendeinem Grund kann ich 'std :: make_unique' nicht verwenden. Aber mit dem alternativen Ansatz funktioniert es. –

+1

@chintans 'make_unique' wurde in C++ 14 hinzugefügt, Sie benötigen also eine stdlib-Implementierung, die diese Version unterstützt. – Praetorian

2

Ja, es gibt. Sie müssen es mit einem tatsächlichen Objekt initialisieren, wie folgt aus:

std::unique_ptr<foo> meanObj(std::make_unique<foo>()); 

Ohne diese, sind Sie den Standardkonstruktor von std::unique_ptr Aufruf, der den Spitz zu Grunde liegenden Element nullptr setzt. Ihre Rücksicht auf die nächste Zeile ist daher eine Nullzeiger-Dereferenzierung.

4

Ja, gibt es, wo initialisierst du die std::unique_ptr?

Sie sind nicht, und deshalb wird std::unique_ptr auf nullptr zeigen, und Sie können es nicht ablehnen, so erhalten Sie einen Segmentierungsfehler.

initialisieren es mit std::make_unique:

std::unique_ptr<foo> meanObj = std::make_unique<foo>(); 
0

verwaltet Sie nicht meanObj gesetzt/eigene, etwas zu zeigen. Sie müssen den Smart Pointer mit einem foo Objekt initialisieren.

Falls Sie nicht verwenden C++ 14 und Sie nicht möchten, dass Ihre unique_ptr an der gleichen Stelle initialisieren Sie es deklarieren, können Sie

meanObj.reset(new foo()); 
0

weiß ich, dass Sie bereits eine Antwort akzeptiert , aber von dem, was ich sehe, brauchen Sie überhaupt kein unique_ptr zu verwenden. Verwenden Sie einfach das Objekt selbst:

foo meanObj; 
meanObj.setMean(input); 
+0

Der Code, den ich gepostet habe, ist eine gekürzte Version, der eigentliche Code ist viel zu kompliziert. –