1

ブレークポイントを使用して、要素をマルチセットに挿入しているときに比較関数が呼び出されているかどうかを確認しましたが、ブレークポイントに到達しません。

エラーUnhandled exception at 0x003c5a71 in Regular_Calibration_d.exe: 0xC0000005: Access violation reading location 0x00000014.

以下にコードを貼り付けます。どこが間違っているのか教えてください。私が疑問に思っているいくつかの重要なこと。

  • 1) 私は実際にマルチセットに挿入する前に sms.message を操作しています。

  • 2)しばらくの間、文字列操作に何か問題があると思うのに、 time を比較する比較関数にヒットしないのはなぜですか。

以下は私のコードです。

SMSの構造

struct SMS
{
  SMS(const SMSType::Enum e, const QString& s);
  QDateTime          time;
  SMSType::Enum      smsType;
  QString            message;
};

//メッセージのコンストラクタ

SMS::SMS( const SMSType::Enum e, const QString& s )
: smsType( e ), message( s )
{
   time = QDateTime::currentDateTime();

}

//比較関数

bool SMS_list::LessSMSTime::operator ()( const SMS& left,
                     const SMS& right ) const
{

  QDate date_left  = left.time.date();
  QDate date_right = right.time.date();

  if( date_left.year() < date_right.year() )
    return true;
  else if( date_left.year() > date_right.year() )
    return false;

  if( date_left.month() < date_right.month() )
    return true;
  else if( date_left.month() > date_right.month() )
    return false;

  if( date_left.day() < date_right.day() )
    return true;
  else if( date_left.day() > date_right.day() )
    return false;

  QTime time_left  = left.time.time(); 
  QTime time_right = right.time.time(); 

  if( time_left.hour() < time_right.hour() )
         return true;
    else if( time_left .hour() > time_right.hour() )
         return false;

 if( time_left.minute() < time_right.minute() )
         return true;
    else if( time_left.minute() > time_right.minute() )
         return false;

  if( time_left.second() < time_right.second() )
          return true;
     else if( time_left.second() > time_right.second() )
          return false;

  if( time_left.msec() < time_right.msec () )
          return true;

  return false;
}

//マルチセットの宣言

std::multiset<SMS, LessSMSTime> SMSSet;

// 一部の関数で

SMSSet.insert( sms ) ;

// 文字列操作

void SMSInterface::output( const SMSType::Enum type, QString str_qt ) const
{

 // convert QString to std::String
 std::string str = str_qt.toStdString();
 QMutex mutex;
 mutex.lock();

 if( str[ str.length() - 1 ] == '\n' )
 {
  str = std::string( str.cbegin(),   str.cbegin() + str.length() - 1 );
 }

 //convert std::string to QString
 QString str_to_qt = QString::fromStdString ( str );
// QString str_to_qt = QString::fromUtf8 ( str.c_str() );

    SMS sms( type, str_to_qt );
    sms_list_->add_sms( message ); // inside this function multi-set insertion is called
bla bala 


 mutex.unlock();
}
4

1 に答える 1

1

説明したように、

「アクセス違反読み取り場所 0x00000014」

メンバー関数を呼び出そうとしたか、null のプロパティを読み取ろうとしたことを示唆しています。

さらにコードを投稿すると、

sms_list_->add_sms( message );

null実際、これは初期化されておらず、nullだった可能性がある唯一のものとして、問題が発生しました。

于 2013-12-17T10:03:17.670 に答える