Нарушение прав доступа члена объекта указателя - PullRequest
0 голосов
/ 26 апреля 2010

Итак, я пишу эту программу клиент / сервер. Этот код со стороны клиента. У клиента есть экземпляр объекта

mpqs_sieve *instance_;

Причина, по которой я делаю это в качестве указателя, состоит в том, что mpqs_sieve имеет только конструктор, который принимает 3 аргумента, и я хочу создать его экземпляр в более поздний момент времени.

Клиент сначала получает некоторые данные с сервера и использует их для создания экземпляра instance_. После этого он запросит еще несколько данных и, получив их (это три коэффициента для квадратичного полинома), должен установить их в объекте instance_. Однако после вызова функции-члена instance_ я получаю нарушение прав доступа к одному из членов instance_ в рамках вызова этой функции.

Я разместил свой код здесь: на pastebin , и я получил ошибку в строке 100. Вызов поступил из строки 71 и до этой строки 21. Вот выдержка:

class client_protocol {
public:
    static std::string parse_message(
        network_message& msg, mpqs_sieve *instance_)
    {
        // ...
        return set_mpqs_data(m.substr(i+1), instance_);
    }

private:
    static std::string set_mpqs_data(
        std::string data, mpqs_sieve *instance_)
    {
        instance_ = new mpqs_sieve(n, M, FB_count);
        // ...
    }
};

Есть идеи, чтобы решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2010

Вы передаете копию указателя instance_ на функцию, а не ссылку на переменную. Когда вы присваиваете instance_, вы изменяете локальную переменную, а не переменную-член с тем же именем.

Измените параметр функции на mpqs_sieve *&instance_.

0 голосов
/ 26 апреля 2010

Замечание о ссылках на переменные в существующем ответе - хороший момент, и я вижу еще одну потенциальную проблему:

Если я правильно понимаю ваш код, объект создается в функции set_mpqs_data () в строке 48. Вы уверены, что функция set_mpqs_data () вызывается до этого времени (обрабатывается сообщение MPQS_DATA)? В противном случае instance_ может не указывать на реальный объект при вызове set_polynomial_data ().

...