工厂构造中的段错误 class
Segfault in factory constructed class
我遇到一个问题,即段错误发生在随机位置,但这些位置似乎总是相同的。段错误的位置可能会根据我是使用 gdb 还是 valgrind 来尝试解决问题而发生变化,这一事实也让问题变得更加混乱。这 似乎 是一个竞争条件问题,但我并不总是看到我的任何析构函数被调用,所以我不确定为什么会发生这种情况。我没有定义我的复制构造函数,我想这可能是问题所在,但我想了解为什么会这样。
我在 midLevel class 上进行的测试来行使它的功能没有这个问题。我的基本构造有什么缺陷吗?
我的用例是:
最高级别class:
returnObject highLevelClass::performTask( ){
std::shared_ptr< midLevelClass > midClass;
std::vector< someType > dataForClass;
for ( auto it = _someIterate.begin( ); it != _someIterate.end( ); it++ ){
...
buildMidClass( midClass, &dataForClass );
}
...
return returnObject;
}
returnObject highLevelClass::buildMidClass( std::shared_ptr< midLevelClass > &midClass,
std::vector< someType > *dataForClass ){
...
midClass = midLevelClass( _configurationInfo ).create( )
midClass.loadData( dataForClass );
midClass->processData( ); //SOMETIMES IT SEGFAULTS HERE DURING std::vector ALLOCATIONS
...
return returnObject;
}
highLevelClass::~highLevelClass( ){
//SOMETIMES IT SEGFAULTS HERE
return;
}
处于中等水平class:
midLevelClass::loadData( std::vector< someType > *data ){
_data = data; //_data is a std::vector< someType >*
}
std::shared_ptr< midLevelClass > midLevelClass::create( configurationType &_configInfo ){
if ( _configInfo[ "type" ] == childMidLevelClass ){
return std::make_shared< childMidLevelClass >( _configInfo );
}
_error = new errorNode( "create", "The type is not defined" );
return std::make_shared< volumeReconstructionBase >( _config, _error );
}
结果是另一个 std::vector(代码的任何其他部分都没有访问它)由于使用 [] 的错误访问而溢出。 gdb 或 valgrind 中没有任何内容表明这是问题所在。答案可能是小心使用 [] 访问 std::vector 并考虑使用 std::vector::at( ).
我遇到一个问题,即段错误发生在随机位置,但这些位置似乎总是相同的。段错误的位置可能会根据我是使用 gdb 还是 valgrind 来尝试解决问题而发生变化,这一事实也让问题变得更加混乱。这 似乎 是一个竞争条件问题,但我并不总是看到我的任何析构函数被调用,所以我不确定为什么会发生这种情况。我没有定义我的复制构造函数,我想这可能是问题所在,但我想了解为什么会这样。
我在 midLevel class 上进行的测试来行使它的功能没有这个问题。我的基本构造有什么缺陷吗?
我的用例是:
最高级别class:
returnObject highLevelClass::performTask( ){
std::shared_ptr< midLevelClass > midClass;
std::vector< someType > dataForClass;
for ( auto it = _someIterate.begin( ); it != _someIterate.end( ); it++ ){
...
buildMidClass( midClass, &dataForClass );
}
...
return returnObject;
}
returnObject highLevelClass::buildMidClass( std::shared_ptr< midLevelClass > &midClass,
std::vector< someType > *dataForClass ){
...
midClass = midLevelClass( _configurationInfo ).create( )
midClass.loadData( dataForClass );
midClass->processData( ); //SOMETIMES IT SEGFAULTS HERE DURING std::vector ALLOCATIONS
...
return returnObject;
}
highLevelClass::~highLevelClass( ){
//SOMETIMES IT SEGFAULTS HERE
return;
}
处于中等水平class:
midLevelClass::loadData( std::vector< someType > *data ){
_data = data; //_data is a std::vector< someType >*
}
std::shared_ptr< midLevelClass > midLevelClass::create( configurationType &_configInfo ){
if ( _configInfo[ "type" ] == childMidLevelClass ){
return std::make_shared< childMidLevelClass >( _configInfo );
}
_error = new errorNode( "create", "The type is not defined" );
return std::make_shared< volumeReconstructionBase >( _config, _error );
}
结果是另一个 std::vector(代码的任何其他部分都没有访问它)由于使用 [] 的错误访问而溢出。 gdb 或 valgrind 中没有任何内容表明这是问题所在。答案可能是小心使用 [] 访问 std::vector 并考虑使用 std::vector::at( ).