2016-04-25 8 views
0

Ich habe eine Klasse A, die den Klammeroperator außer Kraft setzt. Der folgende Code funktioniert:Segmentierungsfehler C++, nach dem Klammeroperator

int main(){ 
    .. 
    A a; 
    cout << a({0.5}); 
    .. 
} 

Während der folgende Code nicht

A fun(){ 
    .. 
    A a; 
    return a; 
    .. 
} 
int main(){ 
    .. 
    A a = fun(); 
    cout << a({0.5}); 
} 

funktioniert Wenn ich diesen zweiten Code auszuführen, habe ich folgende Fehlermeldung:

segmentation fault (core dumped) 

ich kann verstehe nicht warum.

EDIT:

dies das vorrangige des Betreibers ist:

FFNeuralNetwork_(Features_<InputC, denseOutput>& phi, unsigned int neurons, 
       unsigned int outputs) : 
    ParametricRegressor(phi, outputs), BatchRegressor_<InputC, arma::vec, denseOutput>(phi, outputs) 
{ 
    layerFunction.push_back(new Sigmoid()); 
    layerFunction.push_back(new Linear()); 

    layerNeurons.push_back(neurons); 
    layerNeurons.push_back(outputs); 

    setupNetwork(); 
} 

Und tatsächlich:

typedef FFNeuralNetwork_<arma::vec> FFNeuralNetwork; 

Wo FFNeuralNetwork war

virtual arma::vec operator()(const InputC& input) override 
{ 
    const arma::vec& x = params.normalizationF->normalize(Base::phi(input)); 
    forwardComputation(x); 
    return params.normalizationO->restore(h.back()); 
} 

Dies ist der Konstruktor die Klasse A, das ich in dem Beispiel verwendet habe.

Hier ist der eigentliche Arbeitscode:

BasisFunctions basisPlane_ = IdentityBasis::generate(1); 
DenseFeatures phiPlane_(basisPlane_); 
FFNeuralNetwork planeNet(phiPlane_, 10, 1); 
cout << planeNet({0.5}); 

Hier ist der nicht funktionierenden Code:

FFNeuralNetwork createNetwork(..){ 
    BasisFunctions basisPlane_ = IdentityBasis::generate(1); 
    DenseFeatures phiPlane_(basisPlane_); 

    FFNeuralNetwork planeNet(phiPlane_, 10, 1); 
    return planeNet; 
} 
.. 
FFNeuralNetwork net = createNetwork(..); 
cout << net({0.5}); 
+2

Wir müssen den Code für Klasse A sehen, um diesen herauszufinden. –

+0

es ist sehr lang, denken Sie, es ist genug, wenn ich nur das Überschreiben des Klammeroperators posten? – Samuele

+0

Ja, schneiden Sie den Code auf die relevanten Teile ab. Ich denke, dass die Konstruktoren neben dem Klammeroperator auch interessant sein könnten. –

Antwort

2

In diesem Stück Code Sie vorbei eine lokale Variable phiPlane_ durch Verweis:

FFNeuralNetwork createNetwork(..){ 
    BasisFunctions basisPlane_ = IdentityBasis::generate(1); 
    DenseFeatures phiPlane_(basisPlane_); 

    FFNeuralNetwork planeNet(phiPlane_, 10, 1); // <- HERE 
    return planeNet; 
} 

FFNeuralNetwork net = createNetwork(..); 
cout << net({0.5}); 

Sobald die Funktion das Objekt zurückgibt, das als Referenz übergeben wurde, existiert kein Code mehr Ich könnte danach darauf zugreifen. Es mag oder kann nicht OK sein, je nachdem, was in ParametricRegressor(phi, outputs) passiert, aber es scheint ein bisschen zweifelhaft für mich und könnte Ihr Problem erklären.

+0

Sorry, ich bin neu in C++. Warum sagst du, dass phiPlane nach der Rückkehr nicht mehr existiert? Was muss ich tun, um dieses Problem zu beheben? – Samuele

+0

Das 'phiPlane_'-Objekt existiert nur als lokale (Stapel-) Variable in der Funktion und sobald die Funktion zurückkehrt, ist das Objekt zerstört und nicht mehr gültig. Wenn Sie einen Verweis (Zeiger) an einen anderen Ort übergeben und versucht, auf das Objekt zuzugreifen, nachdem es verschwunden ist, werden schlimme Dinge passieren. –

+0

Okay ... wie kann ich das Problem beheben? Soll ich globale Variable für PhiPlane verwenden? oder gibt es eine elegantere lösung? – Samuele