代码如下:
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
但我现在适用的是定义对象的方式,而不是对象指针的方式,运行起来也没有错误,
但我觉得这儿应该出错的,因为这个定义的对象是一个局部变量,它的定义处理这个局部定义区间就实效了
不知道我这样认为对不对?
我是想知道为什么没有出错
请指教!
谢谢!
14 个解决方案
#1
放入的是一个副本.
LZ可以写一个类,在构造函数和西狗函数中加一些信息输出语句
然后将此类对象push_back看看效果
LZ可以写一个类,在构造函数和西狗函数中加一些信息输出语句
然后将此类对象push_back看看效果
#2
Vector的每个元素是指针
#3
我的意思是说这个局部变量出了其作用域后,存储该变量的空间也就相应地不存在了
“副本”:存储空间在那儿呢?
“指针”:指针指向的存储空间是哪儿呢?
“副本”:存储空间在那儿呢?
“指针”:指针指向的存储空间是哪儿呢?
#4
“副本”:存储空间在那儿呢?
自然是vector维护的,具体的可以想办法寻找stl实现
自然是vector维护的,具体的可以想办法寻找stl实现
#5
指针?应该是副本,就是类似于函数返回值,迭代器才是指针。
#6
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
#7
“副本”:存储空间在那儿呢?
自然是vector维护的,具体的可以想办法寻找stl实现
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
自然是vector维护的,具体的可以想办法寻找stl实现
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
#8
是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。
#9
在VS2005里,可以在#include <vector>那里,鼠标右键,有一项打开指定文档,就可以打开vector文件,看他的源代码。VS2005用的STL里vector的底层是用deque实现的,还要去看deque的源代码才能彻底弄明白。
#10
如果是每次push_back都new出来一个对象的存储空间的话,
那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了
CTrochoidData *lpszCTrochoidData = new CTrochoidData ();
m_trochoidDataVec.push_back(lpszCTrochoidData);
#11
当然不申请。压入指针就存贮指针嘛。
#12
这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:六&四&七&九&八&七&九&二,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!
#13
vector的push_back(Object) Object可以是指针也可以是对象。
我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。
我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。
#14
这种情况下,不会再申请新的内存。
因为这时你的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);
因为这时你的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);
#1
放入的是一个副本.
LZ可以写一个类,在构造函数和西狗函数中加一些信息输出语句
然后将此类对象push_back看看效果
LZ可以写一个类,在构造函数和西狗函数中加一些信息输出语句
然后将此类对象push_back看看效果
#2
Vector的每个元素是指针
#3
我的意思是说这个局部变量出了其作用域后,存储该变量的空间也就相应地不存在了
“副本”:存储空间在那儿呢?
“指针”:指针指向的存储空间是哪儿呢?
“副本”:存储空间在那儿呢?
“指针”:指针指向的存储空间是哪儿呢?
#4
“副本”:存储空间在那儿呢?
自然是vector维护的,具体的可以想办法寻找stl实现
自然是vector维护的,具体的可以想办法寻找stl实现
#5
指针?应该是副本,就是类似于函数返回值,迭代器才是指针。
#6
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
#7
“副本”:存储空间在那儿呢?
自然是vector维护的,具体的可以想办法寻找stl实现
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
自然是vector维护的,具体的可以想办法寻找stl实现
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
#8
是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。
#9
在VS2005里,可以在#include <vector>那里,鼠标右键,有一项打开指定文档,就可以打开vector文件,看他的源代码。VS2005用的STL里vector的底层是用deque实现的,还要去看deque的源代码才能彻底弄明白。
#10
如果是每次push_back都new出来一个对象的存储空间的话,
那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了
CTrochoidData *lpszCTrochoidData = new CTrochoidData ();
m_trochoidDataVec.push_back(lpszCTrochoidData);
#11
当然不申请。压入指针就存贮指针嘛。
#12
这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:六&四&七&九&八&七&九&二,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!
#13
vector的push_back(Object) Object可以是指针也可以是对象。
我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。
我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。
#14
这种情况下,不会再申请新的内存。
因为这时你的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);
因为这时你的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);