首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

因为这个有关问题,五一也没法休息,关于list push_back 出现段错的,先给50分垫垫底吧

2012-02-11 
因为这个问题,五一也没法休息,关于list push_back 出现段错的,先给50分垫垫底吧两个类,ABm_TaskInfo和其中

因为这个问题,五一也没法休息,关于list push_back 出现段错的,先给50分垫垫底吧
两个类,ABm_TaskInfo和   其中一个包含另外一个

class   ABm_TaskInfo
{
public:
                  UINT32m_uiTaskID;
UINT32m_uiConnfd;
struct     timeval     m_TimeArrive;list <ABm_ActionInfo> m_ActionInfo;stringm_strReply;

public:

ABm_TaskInfo()
{
Reset();
}

~ABm_TaskInfo()
{
Reset();
}

  ABm_TaskInfo   (const   ABm_TaskInfo   &item)
  {
m_uiTaskID   =   item.m_uiTaskID;
m_uiConnfd   =   item.m_uiConnfd;
m_TimeArrive.tv_sec   =   item.m_TimeArrive.tv_sec;
m_TimeArrive.tv_usec   =   item.m_TimeArrive.tv_usec;
m_ActionInfo   =   item.m_ActionInfo;
m_strReply   =   item.m_strReply;
}

ABm_TaskInfo&  
operator=(const   ABm_TaskInfo   &item)
{
m_uiTaskID   =   item.m_uiTaskID;
m_uiConnfd   =   item.m_uiConnfd;
m_TimeArrive.tv_sec   =   item.m_TimeArrive.tv_sec;
m_TimeArrive.tv_usec   =   item.m_TimeArrive.tv_usec;
m_ActionInfo   =   item.m_ActionInfo;
m_strReply   =   item.m_strReply;

return   *this;
}

void     Reset(void)
{
m_uiTaskID   =   -1;
m_uiConnfd   =   0;
memset(&m_TimeArrive,   0,   sizeof(struct   timeval));
m_ActionInfo.clear();
m_strReply   =   " ";
}

}

[解决办法]
#include <iostream>
using namespace std;

class A
{
public:
A(){};
A(const A&a){cout < < "copy constructor " < <endl;}
A& operator =(A& a){cout < < "= " < <endl;return a;}
};
int main()
{
A a;
A b = a;
A c;
c=a;
cin.get();
return 0;
}
[解决办法]
#1: 我觉得段错误是由于Action_Info里m_cMonStatus和m_cMonInfo的值是NULL引起,这样strlen(item.m_cMonStatus)就会访问NULL地址而出错.
#2就说来话长了,涉及到STL的内部细节. 注意STL中对象的管理比较特别,在对象空间的申请释放和构造析构函数调用是完全分开进行的. 举个例子,若想使用一个T类型的变量,我们通常会这样作:
T *ptr = new T(); // alloc memory AND call constructor
// do something...
delete ptr; // call destructor AND free memory
而在STL(例如vector和list)中,大概是这样的:
void *pMem = Allocator::alloc(..); // alloc memory, similiar to malloc()
T* ptr = new (pMem) T(); // call constructor
// do something..
ptr-> ~T(); // call destructor
Allocator::free(..); // free moery, similor to free()
即先自己申请一段内存,再利用inplace new调用构造函数. 在退出时先显式地调用析构函数. 这样作的优点是可以完全自己控制对象在内存中的分布,STL的container很大程度上依赖于这一点.
正因为这样, 关于=操作符和拷贝构造函数STL对象的一些行为会与我们预想的不一样,在我们认为是operator =()的地方,STL实际上先申请空间再调用copy constructor.
btw, 我猜测正是这个原因,STL规定作为其容器Element的类需要同时有拷贝构造函数和=操作符,并且二者行为要一致.

热点排行