0

クラス定義

class TaskWorker
{
    ...
    private:
            std::list<client_det*> clientList;
    ...

    public:
            void waitForClientResponse();
};

クラスメンバー関数をスレッドとして実行する関数

void* waitForResponse(void* w)
{
    TaskWorker* worker = static_cast<TaskWorker*>(w);
    worker->waitForClientResponse();
}

スレッド機能の実装

void TaskWorker::waitForClientResponse()
{
    client_det* obj = new client_det();
    ...
    clientList.push_back(obj); //valgrind says access violation
    ...
}

この実装に何か問題がありますか?
プライベートメンバーリストにアクセスするスレッドクラスのメンバー関数に制限はありますか?

スレッド呼び出し

int TaskWorker::assign_and_wait(std::list<MulticastGroupInfo*> groupList)
{
     ...
     ...               
     pthread_t tid;
     pthread_create(&tid, NULL, waitForResponse, this);
}

アップデート

デバッグ シンボルを使用せずにコードをコンパイルしたところ、クラッシュはなくなりました。これが私の最近の観察です。
誰でもここで何が起こっているのか教えてもらえますか?

4

1 に答える 1

1

コードでセグメンテーション違反を引き起こす可能性のあるいくつかの事柄を次に示します。

  • のインスタンスは、null チェックインが存在しないTaskWorker可能性があります。これにより、メンバー変数への最初のアクセスでアクセス違反が発生する可能性があります。NULLvoid* waitForResponse(void* w)void TaskWorker::waitForClientResponse()

  • 安全でない C スタイルの文字列操作は避けてください。たとえば、十分に注意しないとstrcpy、バッファがオーバーフローし、無関係なメモリが上書きされます。

  • 複数のスレッドがclientList(または他の共有リソースを) 共有する場合は、適切な相互排除メカニズムが整っていることを確認してください。

于 2013-11-01T13:14:36.500 に答える