新记录下来:void dispatch(){
ChannelContext ctx = this->getContext(msg->channelID); ctx.e = new Event(); addEvents(msg, ctx.e);
addEvents(msg, this->getContext(msg->channelID).e);
}
ChannelContext &ChannelSvr::getContext(int i_channelID) { for(int i = 0;i< m_channelContext.size();i++) { if(m_channelContext[i].iChannelID == i_channelID) return m_channelContext[i]; } }
该函数返回的是引用:即m_channelContext中元素的引用。
std::vector<ChannelContext> m_channelContext;
//注意(与本文无关):vector 的push_back()操作,保存的参数的副本。即复制了参数。
struct tagChannelContext{
int iChannelID;
Event* e;
bool stopThreads;
int sourceLinkerSts;
bool Ananlyzed;
bool postdata;
bool drawBound;
};
typedef struct tagChannelContext ChannelContext;
struct tagChannelContext{ int iChannelID; Event* e; bool stopThreads; int sourceLinkerSts; bool Ananlyzed; bool postdata; bool drawBound; }; typedef struct tagChannelContext ChannelContext;
第一种情况:
//error
ChannelContext ctx = this->getContext(msg->channelID);
//这一步是复制初始化,因此ctx的值是返回值的副本。因此改变ctx时,不会影响原先的值。
ctx.e = new Event();
addEvents(msg, ctx.e);
对ctx.e的操作,不会影响到m_channelContext 的值。
第二种情况:
addEvents(msg, this->getContext(msg->channelID).e);
会修改m_channelContext 的值。
原因分析:
应该是出在ChannelContext ctx = this->getContext(msg->channelID);这是复制初始化操作。
C++初始化分两种:
第一种是直接初始化 :string("123445")
第二种是复制初始化: string s = "123456"
扩展到类原来相同。
补充: 一种解决方法
ChannelContext &ctx = this->getContext(msg->channelID);
相关文章:http://blog.sina.com.cn/s/blog_93b45b0f0100zsw5.html