我遇到了分段错误,我无法弄清楚原因。我有一个全局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
答案 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
对象“。