2016-04-25 27 views
0

我有一個類A覆蓋括號運算符。 下面的代碼工作:分段錯誤C++,括號後的運算符

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

雖然下面的代碼不起作用

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

當我執行這個第二個代碼,我有以下錯誤:

segmentation fault (core dumped) 

我可以不明白爲什麼。

編輯:

這是運營商的首要:

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()); 
} 

這是構造:

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(); 
} 

而實際上:

typedef FFNeuralNetwork_<arma::vec> FFNeuralNetwork; 

凡FFNeuralNetwork是班上 我在示例中使用了一個。

這裏實際工作代碼:

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

這裏沒有工作代碼:

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

我們將不得不看「class A」的代碼來判斷這個問題。 –

+0

它很長,如果我發佈括號操作符的重寫,你認爲它是足夠的嗎? – Samuele

+0

是的,請將代碼修剪到相關部分。除了括號運算符,我認爲構造函數也可能很有趣。 –

回答

2

在此位的代碼,你通過引用傳遞一個局部變量phiPlane_

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}); 

一旦函數返回通過引用傳遞的對象不再存在,那麼沒有代碼sh之後可以訪問它。根據ParametricRegressor(phi, outputs)發生的情況,它可能會也可能不會,但它對我來說似乎有點可疑,並且可以解釋您的問題。

+0

對不起,我是C++新手。爲什麼你說phiPlane在退貨後不再存在?我該怎麼辦才能解決這個問題? – Samuele

+0

phiPlane_'對象只在函數中作爲本地(堆棧)變量存在,一旦函數返回,對象被銷燬並且不再有效。如果你將一個引用(指針)傳遞給另一個地方,並在它消失後嘗試訪問該對象,則會發生不好的事情。 –

+0

好的......那麼我該如何解決這個問題?我應該使用phiPlane的全局變量嗎?還是有更優雅的解決方案? – Samuele