我要将提取的数据存到vector 中,但对push_back的应该是对象还是对象指针有点不太清楚 
代码如下: 
                                        if ( szNodeName == "PointData" ) 
                                        { 
IXMLDOMNode  *pXDN3; 
pXDN2->get_firstChild(&pXDN3); CTrochoidData szTrochoidData; 
//CTrochoidData *lpszCTrochoidData = new CTrochoidData ();
while (pXDN3 != NULL) 

BSTR_NodeName  = NULL; 
pXDN3->get_nodeName(&BSTR_NodeName); 
szNodeName =  (CString)BSTR_NodeName; 
if ( szNodeName == "WellLength" ) 

pXDN3->get_text(&BSTR_item); 
bstr_item = BSTR_item; CString strWellLength = bstr_item.copy(); 
szTrochoidData.m_fWellLength = _wtof(strWellLength); 

else if ( szNodeName == "SlantAngle" ) 

pXDN3->get_text(&BSTR_item); 
bstr_item = BSTR_item; CString strSlantAngle = bstr_item.copy(); 
szTrochoidData.m_fSlantAngle = _wtof(strSlantAngle); 

else if ( szNodeName == "AzimuthAngle" ) 

pXDN3->get_text(&BSTR_item); 
bstr_item = BSTR_item; CString strAzimuth = bstr_item.copy(); 
szTrochoidData.m_fAzimuthAngle = _wtof(strAzimuth); 

pXDN3->get_nextSibling(&pXDN3); 

m_trochoidDataVec.push_back(szTrochoidData); 

vector的定义: vector <CTrochoidData> m_trochoidDataVec; //数据vector 其他代码可以不必理会,只注意下面这三句就可以了, 
CTrochoidData szTrochoidData; 
//CTrochoidData *lpszCTrochoidData = new CTrochoidData (); 
m_trochoidDataVec.push_back(szTrochoidData); 
我觉得应该用new出来的对象指针,然后用vector中的元素指向这个空间,当然vector的定义也应该相应改为 
vector <CTrochoidData *> m_trochoidDataVec; //数据vector 
但我现在适用的是定义对象的方式,而不是对象指针的方式,运行起来也没有错误, 
但我觉得这儿应该出错的,因为这个定义的对象是一个局部变量,它的定义处理这个局部定义区间就实效了 
不知道我这样认为对不对? 
我是想知道为什么没有出错 
请指教! 
谢谢! 

解决方案 »

  1.   

    放入的是一个副本.LZ可以写一个类,在构造函数和西狗函数中加一些信息输出语句然后将此类对象push_back看看效果
      

  2.   

    “副本”:存储空间在那儿呢? 自然是vector维护的,具体的可以想办法寻找stl实现
      

  3.   

    你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
      

  4.   

    “副本”:存储空间在那儿呢? 自然是vector维护的,具体的可以想办法寻找stl实现
    你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
      

  5.   

    是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。
      

  6.   

    在VS2005里,可以在#include <vector>那里,鼠标右键,有一项打开指定文档,就可以打开vector文件,看他的源代码。VS2005用的STL里vector的底层是用deque实现的,还要去看deque的源代码才能彻底弄明白。
      

  7.   


    如果是每次push_back都new出来一个对象的存储空间的话,
    那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了
    CTrochoidData *lpszCTrochoidData = new CTrochoidData (); 
    m_trochoidDataVec.push_back(lpszCTrochoidData); 
      

  8.   

    这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:六&四&七&九&八&七&九&二,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!
      

  9.   

    vector的push_back(Object) Object可以是指针也可以是对象。
    我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
    另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。
      

  10.   

    这种情况下,不会再申请新的内存。
    因为这时你的vector要这样定义:
    vector<CTrochoidData*> m_trochoidDataVec;
    即每个元素是1个指针,而不是对象。
    指针的拷贝构造,就是普通变量的赋值操作,不会新new出该类的对象。
    执行push_back时,该函数会检查if (size() < capacity()),如果成立,则不需要申请新内存,在老内存里使用placement new,即最里面是这个语句:
    template<class _T1, class _T2>
    void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
    {
        ::new (_Ptr) _T1(_Val);
    }
    其中_Ptr是那个即将存放这个对象的内存指针,Val是push_back(lpszCTrochoidData)中的lpszCTrochoidData。
    相当于执行 ::new (_Ptr) CTrochoidData* (lpszCTrochoidData);