全局变量分段故障
Global variable seg fault
我得到一个分割错误,我不知道为什么。我有一个全局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
对象。"
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 对程序故障进行分段
- 分段故障说明
- 分段故障(核心转储)-不知道为什么
- 分段故障线程
- hiredis SET遇到分段故障
- 分段故障,合并排序算法
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 到达主C++之前分段故障
- 分段故障核心使用 IF流转储
- 使用向量的移动键盘排列(分段故障)
- 在二进制树插入和遍历期间,我得到了分段故障
- 分段故障在类之间返回整数