Ошибка глобальной переменной seg - PullRequest
0 голосов
/ 24 июля 2011

У меня ошибка сегментации, и я не могу понять, почему.У меня есть глобальный объект TcpClient, который имеет указатель на объект агента.Я пытаюсь получить доступ к указателю агента в функции, когда происходит ошибка сегментации.В основном, у меня есть операторы cout до и после того, как я установил член агента в TcpClient, и оба оператора дают мне один и тот же адрес.

TcpClient client((char*)PORT);
Agent* agent = new Agent;

int main(int argc, char* args[]) {
    //initialization code for agent's members
    cout<<"\nagent: "<<agent;
    client.setAgent(agent); //set it here
    cout<<"\nclient agent: "<<client.getAgent()<<"\n";
}

Затем у меня есть эта функция в TcpClient, которая вызывается во время выполнения (после установки агента конечно).Я получаю ошибку сегментации, когда пытаюсь получить доступ к агенту.У меня есть заявление cout в начале, которое говорит мне, что агент 0x0.

void TcpClient::getCommand(char* command) { 
    std::cout<<"\nagent: "<<agent;

}

Тип setAgent является типичным установщиком -

void TcpClient::setAgent(Agent*& a) {agent = a;}



class Agent;
class TcpClient {
    //functions and stuff
private:
    Agent* agent;
};

Элемент агента не доступен нигде в коде.Единственное, что я могу придумать - это то, что объект TcpClient является глобальным, что может сделать это, но я не знаю, что.Я прав насчет этого?Любая помощь приветствуется.

Когда я запускаю код, отладчик говорит -

Program received signal SIGSEGV, Segmentation fault.
__memcpy_ssse3_rep () at ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S:1454
1454    ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S
(gdb) back
#0  __memcpy_ssse3_rep ()
    at ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S:1454
#1  0x08049c52 in Agent::setGoal (this=0x0, g=...) at agent.cpp:33
#2  0x0805075e in TcpClient::getCommand (this=0x805aac8, 
command=0xbffff18d "1 3 1\n") at tcpclient.cpp:80
#3  0x08050b8d in TcpClient::communicate (this=0x805aac8) at tcpclient.cpp:153
#4  0x0804e0f8 in main (argc=1, args=0xbffff3f4) at mainclient.cpp:119

Ответы [ 3 ]

1 голос
/ 03 июля 2012

У меня есть функция, называемая связью (которая просто позволяет серверу и клиенту общаться друг с другом), которая вызывает функцию getCommand, которую я опубликовал выше. Прямо перед тем, как я вызвал getCommand, был вызов memset для локального символа *. Все, что я сделал, это удалил эту строку, и ошибка сегментации ушла.

Спасибо за помощь всем.

1 голос
/ 24 июля 2011

Вы должны прочитать предупреждения компилятора / компоновщика, я вполне уверен, что они будут вызывать у вас неоднозначные имена.

Не используйте «агент» в качестве имени переменной для членов класса, когда выВы уже определили его ранее как глобальный;используйте что-то вроде private: Agent* myAgent; (и, конечно, измените setAgent, чтобы использовать его), и вы должны надеяться, что проблема исчезнет.

Кроме того, * & в основном отменяется;закрытый член - это указатель, поэтому вы должны использовать указатель в методе set - я подозреваю, что ваш segfault вызван неправильной операцией с тем, что он считает указателем, а на самом деле - нет, или наоборот.

0 голосов
/ 24 июля 2011

void TcpClient::setAgent(Agent*& a) {agent = a;} написано как задумано, или вы имели в виду Agent *a?

Если вы передаете объект Agent, синтаксис будет Agent &a, что означает "a - это адрес переданного Agent объекта."

Если вы передаете указатель (который вы здесь делаете), синтаксис будет Agent *a, что означает, что «a передается как (возможно нулевой) указатель на объект Agent».

...