0

私はこのコードを持っています、

class DbUpdater 
{

private:

MYSQL mysql;
MYSQL *connection;

int connect() 
{
    mysql_init(&mysql);
    this->connection = mysql_real_connect(&mysql, "localhost", "root", "password", "dbname", 0, 0, CLIENT_MULTI_STATEMENTS);
    if (this->connection == NULL) 
    {
     printf(mysql_error(&mysql));
     return 0;
    }

    mysql_set_character_set(connection, "utf8");
    return 1;
}

vector <TrackingHistory*> getTrackingHistoryByNumber(string number) 
{
    MYSQL_RES *result;
    MYSQL_ROW row;

   string query = "SELECT * FROM tracking_history WHERE number = '" + number + "' ORDER BY date DESC;";

    int state = mysql_query(this->connection, query.c_str());
    result = mysql_store_result(this->connection);

    vector <TrackingHistory*> trackingHistory;

    int numRows = mysql_num_rows(result);

    while ((row = mysql_fetch_row(result)) != NULL) {

    TrackingHistory *item = new TrackingHistory(atoi(row[0]), atoi(row[1]), string(row[2]), string(row[3]),
        string(row[4]), string(row[5]), string(row[6]), string(row[7]), string(row[8]), string(row[9]));

    trackingHistory.push_back(item);
    }
    mysql_free_result(result);
    return trackingHistory;
}

public:

DbUpdater() 
{
    this->connect();
}

void UpdateDB(vector <HistoryItem*> historyItems) 
{
        vector <TrackingHistory*> trackingHistory = this->getTrackingHistoryByNumber( historyItems[0]->Number);
}

};

だから、私はクラスのインスタンスを作成し、DbUpdater単にメソッドを呼び出しますUpdateDb()

私は機能的に奇妙な振る舞いをしていますgetTrackingHistoryByNumber()

int numRows = mysql_num_rows(result);、この行はsegfaultをスローします。1 つの接続で多くのクエリを実行した場合にのみ発生します。繰り返しのたびに再接続すると、すべてのクエリに問題はありません。

たとえば、10 個のクエリがあります。プログラムを初めて起動すると、2 番目のクエリで segfault がスローされます。次の起動では、3 番目のクエリで segfault がスローされます。そして、次の開始は4番目のクエリでそれをスローします。

libmysqlubuntu 12.04のリポジトリから使用します

この理由は何ですか?

ありがとう、そして私の英語でごめんなさい。

4

0 に答える 0