全局变量seg故障

时间:2011-07-24 17:34:04

标签: c++ memory memory-management segmentation-fault

我遇到了分段错误,我无法弄清楚原因。我有一个全局TcpClient对象,它有一个指向Agent对象的指针。我正在尝试在发生分段错误时访问函数中的代理指针。在main中,我在TcpClient中设置代理成员之前和之后都有cout语句,两个语句都给我相同的地址。

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语句告诉我agent是0x0。

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

}

setAgent是一个典型的setter -

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 个答案:

答案 0 :(得分:1)

你应该阅读编译器/链接器警告,我很确定它会向你抛出一些模棱两可的名字。

当您之前已将其定义为全局时,请不要将“agent”用作类成员的变量名称;使用像private: Agent* myAgent;这样的东西(当然要改变setAgent来使用它),你应该希望找到问题消失。

另外,*&amp;基本上取消了自己;私有成员是一个指针,所以你应该在set方法中使用指针 - 我怀疑你的段错误是因为它认为是指针的操作不好而实际上不是,反之亦然。

答案 1 :(得分:1)

我有一个名为communication(它只让服务器和客户端相互通信)的函数调用我上面发布的getCommand函数。在我调用getCommand之前,有一个memset调用本地char *。我所做的只是移除那条线,分段错误就消失了。

感谢大家的帮助。

答案 2 :(得分:0)

void TcpClient::setAgent(Agent*& a) {agent = a;}是否按预期书写,或者您的意思是Agent *a

如果您传递Agent对象,则语法为Agent &a,这意味着“a是传递的Agent对象的地址。”

如果你传递一个指针(你在这里做),语法是Agent *a,这意味着“a作为一个(可能为空)指针传递给Agent对象“。