1

dataprocthreadcalcvalueの 2 つのクラスを持つ C++ Qt 静的ライブラリがあります。最初のものでは、calcvalueのインスタンスからメソッドを呼び出すと、( dataprocthreadthisクラスを参照する)ポインターが突然 になります。null

これはdataprocthread.hです:

class DataProcThread : public QThread
{
    Q_OBJECT

    public:
        DataProcThread(int sarray[9], int val);

    signals:
        workDone(int result);

    private:            
        int _sarray[9];
        int _val;
        void run();
};

dataprocthread.cpp :

DataProcThread::DataProcThread(int sarray[9], int val)
{
    for (int x = 0; x < 9; x++)
    {
        _sarray[x] = sarray[x];
    }
    _val = val;
}

void DataProcThread::run()
{
    CalcValue* cv = new CalcValue();
    int myval = 0;
    for (int i = 0; i < 100; i++)
    {
        myval = cv->processData(this->_val);
        if (this->_sarray[0] != myval)
        {
            //do something
        }
    }
    emit workDone(intValue);
}

計算値.h :

class CalcValue
{
    public:
        CalcValue();
        int processData(int someval);
};

計算値.cpp :

CalcValue::CalcValue()
{
}

int processData(int someval)
{
    //do something and return int value
}

このコードを実行すると、突然「セグメンテーション違反」というシグナルを受け取ります。デバッガーを使用して、関数に問題があることがわかりました。関数DataProcThread::run()を呼び出すとcv->processData、すべて正常に動作します。しかし、次の行 ( if (this->_sarray[0] != myval)) では、thisポインターが(Locals ウィンドウで確認できます) になるため、変数nullにアクセスできません。this->_sarray

重要な場合は、それがスレッドを開始する方法です(ライブラリ外の別のクラスから):

DataProcThread* thread = new DataProcThread(sarray, val);
QObject::connect(thread, SIGNAL(workDone(int)), this, SLOT(collectWork(int)));
thread->start();

私が間違っていることは何ですか?

4

1 に答える 1

2

コメントで指摘されたように、問題はprocessData機能で発生しました。メモリを上書きしていました。

strncpy私は代わりに単に使用strcpyし、問題はなくなりました(これについての良い説明があります)。

于 2013-04-02T09:07:20.647 に答える