我有一个覆盖括号运算符的类A。以下代码有效:
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是我在示例中使用的A类。
这是实际的工作代码:
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});
在这段代码中,您将通过引用传递一个局部变量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});
一旦函数返回,通过引用传递的对象就不再存在,因此之后没有代码可以访问它。根据ParametricRegressor(phi, outputs)
发生的事情,它可能会也可能不可以,但这对我来说似乎有点可疑,可以解释您的问题。