전산 커널 용 표현 템플릿으로 코드를 생성 중입니다. 내 질문은 매우 짧 :자동 키워드로 작성된 유형을 사용하는 표현식 템플릿의 세그먼트 오류
// Like this it crashes
auto expression = Ix_h(Ix(u));
ut += expression;
하지만 동등한 코드를 입력하지 : GNU G 않는 이유 ++ 다음 예에서 +=
를 포함하는 라인 (-03 컴파일 4.9.1) 세그먼트 폴트를 제공합니다 :
// But like this it does not
ut += Ix_h(Ix(u));
Clang과 Intel 모두 정상적으로 작동합니다.
아래의 전체 코드를 추가했습니다. 길이 미안 내가 만들 수있는 가장 짧은 예 하였다 : 여기
struct Grid
{
Grid(const int itot, const int gc) :
itot(itot), gc(gc), istart(gc), iend(itot+gc), icells(itot+2*gc) {}
const int itot;
const int gc;
const int istart;
const int iend;
const int icells;
};
template<int loc, class Inner>
struct Interp
{
Interp(const Inner& inner) : inner_(inner) {}
const Inner& inner_;
inline double operator()(const int i) const
{
return (-1./16)*(inner_(i + (-2+loc)) + inner_(i + (1+loc)))
+ (9./16)*(inner_(i + (-1+loc)) + inner_(i + ( loc)));
}
};
template<class Inner>
inline Interp<1, Inner> Ix(const Inner& inner)
{ return Interp<1, Inner>(inner); }
template<class Inner>
inline Interp<0, Inner> Ix_h(const Inner& inner)
{ return Interp<0, Inner>(inner); }
class Field
{
public:
Field(const Grid& grid) :
grid_(grid),
data_(new double[grid_.icells]) {}
inline double operator()(const int i) const
{ return data_[i]; }
inline double& operator()(const int i)
{ return data_[i]; }
template<class T>
inline Field& operator+=(const T& expression)
{
for (int i=grid_.istart; i<grid_.iend; ++i)
(*this)(i) += expression(i);
return *this;
}
private:
const Grid& grid_;
double* data_;
};
int main()
{
Grid grid(256, 4);
Field u (grid);
Field ut(grid);
// Like this it crashes
auto expression = Ix_h(Ix(u));
ut += expression;
// But like this it does not
ut += Ix_h(Ix(u));
return 0;
}
을 당신은 아마 정의되지 않은 동작 시나리오로 실행 중입니다. Gdb가 최선의 방법이 될 것입니다. – James