读书人

因为这个有关问题五一也没法休息关

发布时间: 2012-02-11 09:51:35 作者: rapoo

因为这个问题,五一也没法休息,关于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的类需要同时有拷贝构造函数和=操作符,并且二者行为要一致.

读书人网 >C++

热点推荐