vector<CString> 不知道 这样的写法好不好。 有没有这么写的, 我在 用 vector<CString> 的时候 。在 程序关闭时出现了一个问题。提示是下面这样"tstcon32.exe 中的 0x10057816 (CurveChart.ocx) 处未处理的异常: 0xC0000005: 读取位置 0x01b87038 时发生访问冲突 。"中断指向: size_type size() const
{ // return length of sequence
return (_Myfirst == 0 ? 0 : _Mylast - _Myfirst);
}
我现在需要把很多个 字符串存起来。不知道有什么好办法。
{ // return length of sequence
return (_Myfirst == 0 ? 0 : _Mylast - _Myfirst);
}
我现在需要把很多个 字符串存起来。不知道有什么好办法。
m_vecStr.push_back( val );CString str = m_vecStr[ m_vecStr.size() - 1 ];
m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
应该是
vector <CString> m_vecStr;
回spring203, 我没有像你说的那样写。不知道是怎么实现的
{ // return length of sequence
return (_Myfirst == 0 ? 0 : _Mylast - _Myfirst);
}
这个你直接用:m_vecStr.size()
不就行了吗?
你只是加了一个字符串进去,所以你的数组大小也就是1(你是字符串数组,不是字符数组)
m_vecStr.size() - 1 是个大于1的数,这样就如同
int a[1] = {1};
int b = a[20];
如果只加一个字符串的话。
m_vecStr.size() - 1 = 0.。 这个我确定。 问题不是出在这里
CString * pStr=new CString(100);pStr = "AAA";
vectorID.push_back(pStr);
delete[] pStr;指针是这么写吗?有错误
用完再delete吧?我觉得不要用new和引用最好。
感觉你的问题出在这一句:
m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
当Size等于0时,就是这个样子了:
m_vecStr.erase( m_vecStr.begin() + 0 - 1 );
其实,这时候m_vecStr.begin()等于m_vecStr.end(),也就是
m_vecStr.erase( m_vecStr.end() + 0 - 1 );
我有这个限制if ( m_vecStr.size()!= 0 )
{
vector <CString> m_vecStr;
m_vecStr.push_back( val ); CString str = m_vecStr[ m_vecStr.size() - 1 ];
m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
}
CString str = m_vecStr[ m_vecStr.size() - 1 ];
还是
m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
这样用vector <string> m_vecStr;
m_vecStr.push_back( val );
CString str;
if(!m_vecStr.empty())
{
str = m_vecStr.pop_back();
}在还不确定容器是否有数据就从容器中取数据简直是自杀。另外还需要确定取得下标在不在容器里
"tstcon32.exe 中的 0x10057816 (CurveChart.ocx) 处未处理的异常: 0xC0000005: 读取位置 0x01b87038 时发生访问冲突 。"
vector是用SDK编程时期的产物,和CString一起使用不仅看起来别扭,风格不统一,也有可能存在潜在问题.既然是用MFC,就都用MFC这一套库,搭配起来肯定没有问题.
vector是用SDK编程时期的产物????
if ( m_vecStr.size()!= 0 )
{
vector <CString> m_vecStr; // 你确认这行没错吗?
m_vecStr.push_back( val );CString str = m_vecStr[ m_vecStr.size() - 1 ];
m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
}
存进去的是一个指针地址,请问
void push_back(
const Type& _Val
);
引用进去的是一个栈上地址val的,它的值是字串常指针,
所以你应该声明为vector < TCHAR *> m_vecStr;
m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );而不是用
m_vecStr.pop_back();我认为主要问题应该在 线程上。我是在一个线程里对vector的。 我现在不用线程了。用 同样的方法操作 vector或者是 list. 现在不出错了。 但是只有一个线程在用 vector代码如下DWORD WINAPI RecvData(LPVOID pParam)
{
CCurveChartCtrl *p = (CCurveChartCtrl *)pParam;
while (true)
{
p->GetDisplayData();//这里操作vector
Sleep( 1 );
}
return 0;
}
所以我又觉得用法应该没问题。 我现在真不知道问题到底出在哪了。
{
std::vector<CString> vtVal;
{
CString szVal("111111");
vtVal.push_back(szVal);
} //程序执行到这里szVal生存周期结束 szVal将执行析构操作释放资源
//vtVal的0号资源已释放故而vtVal[0]是一个未知内存块。
}
我觉得不是你说的这样的。 szVal是析构了。但是 已经把 szVal所指向的内容 放入vector中了。szVal所指向的内容 是放到 vector的备用空间中的。 szVal释放与否无所谓
vector都用上了,干粹vector<string>或vector<wstring>算了。
要么你就用CStringArray。
#include <vector>
#include <iostream>using namespace std;int main() {
vector<CString> v;
v.push_back("abc");
v.erase(v.begin() + v.size() - 1);
cout << v.size() << endl;
return 0;
}