全局变量分段故障

Global variable seg fault

本文关键字:故障 分段 全局变量      更新时间:2023-10-16

我得到一个分割错误,我不知道为什么。我有一个全局TcpClient对象,它有一个指向Agent对象的指针。当分割故障发生时,我试图访问函数中的代理指针。总的来说,我在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是0。

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 1n") 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

您应该阅读编译器/链接器的警告,我敢肯定它会向您抛出一些关于歧义名称的警告。

不要使用"agent"作为类成员的变量名,如果你之前已经将它定义为全局变量;使用private: Agent* myAgent;之类的东西(当然也要更改setAgent来使用它),你应该有希望发现问题消失了。

此外,*,基本上自我抵消了;private成员是一个指针,所以你应该在set方法中使用一个指针——我怀疑你的段错误是由于一个错误的操作,要么它认为是一个指针,实际上不是,反之亦然。

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

谢谢大家的帮助。

void TcpClient::setAgent(Agent*& a) {agent = a;}是按预期写的,还是Agent *a ?

如果传递一个Agent对象,语法是Agent &a,这意味着"a是传递的Agent对象的地址"。

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