user breakpoint called from[vetor<CString>传值调用的问题]
[size=16px]user breakpoint called from at 0x7c92120
vetor<CString>传值调用的问题,
以下是报错信息的CALL
MSVCRT! 77bfc2de()
// std::allocator<CString>::deallocate(void * 0x00d51ab0, unsigned int 24) line 64 + 16 bytes
// std::vector<CString,std::allocator<CString> >::~vector<CString,std::allocator<CString> >() line 60
// OpreratXlist<ICT_Sch_Dlg>::InitailizeVector(const CString {"Menu.xlsx"}, const CString {"原理图"}) line 110
// ICT_Sch_Dlg::SetDefaultXlist(int 0) line 275 + 58 bytes
// ICT_Sch_Dlg::OnInitDialog() line 173
试过vector<CString>&传值 或者 vector<CString*>& 都没用,看起来是CSTRING析构了俩次导致的问题,求解void ICT_Sch_Dlg::SetDefaultXlist(int nType)
{
CString strPath = _T("Menu.xlsx");
CString strData = _T("原理图");
{
OpreratXlist<ICT_Sch_Dlg> m_Sch(&m_ListSch); // m_ListSch树控件
if (m_Sch.InitailizeVector(strPath,strData))
{
m_Sch.InitListCtrl(nType);
m_Sch.FillListCtrl();
}
}
TRACE(_T("run!"));
}
template <typename Type>
class OpreratXlist
{
public:
OpreratXlist(CXListCtrl *mList);
public:
~OpreratXlist(void);
void FillListCtrl();
void InitListCtrl(int nType);
void InitListCtrlStatus();//追加 初始化状态栏上的XList
public:
vector<CString> vData; //存储检查内容及有无工具信息
private:
CXListCtrl *m_List;
};
template<typename Type> OpreratXlist<Type>::OpreratXlist(CXListCtrl *mList)
{
m_List = mList;
}
template<typename Type> OpreratXlist<Type>::~OpreratXlist(void){}
template<typename Type> bool OpreratXlist<Type>::InitailizeVector(const CString strPath,const CString strData)
{
if (strPath.IsEmpty()||strData.IsEmpty())
{
AfxMessageBox(_T("输入信息不全"));
return false;
}
vData.clear();
EXTData dlg;
vData = dlg.GetXlsxData(strPath,strData);
return true;
}
//EXTData 在DLL中实现的
vector<CString> EXTData::GetXlsxData( const CString strFile, const CString strType)
{
vector<CString> vSpcData;
CExplainDlg dlg(NULL,strFile,strType);
vSpcData = dlg.GetSpcData();
return vSpcData;
}
vector<CString> CExplainDlg::GetSpcData()
{
CString adoInfo;
CString strXlsPath = m_strFileName;
vector<CString> veData;
TCHAR path[256];
GetModuleFileName(NULL,path,sizeof(path)) ;
CString strPath = path;
strPath = strPath.Mid(0,strPath.ReverseFind('\\')+1);
strXlsPath = strPath + strXlsPath;
adoInfo.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;\
Extended Properties=Excel 12.0", strXlsPath);
//创建实例
pConnect.CreateInstance(__uuidof(Connection));
//打开Excel表
try
{
pConnect->Open((_bstr_t)adoInfo, "", "", adModeUnknown);
}
catch (_com_error* e)
{
AfxMessageBox(e->Description());
}
_RecordsetPtr pRst(__uuidof(Recordset));
CString strSQL;
strSQL.Format("Select * from [Sheet1$] Where 阶段='%s' Order by 序号",m_strData);
CString strContext;
CString strTool; //有无工具
CString strSelcet; //可选项
CString strData;
pRst = pConnect->Execute((_bstr_t)strSQL,NULL,adCmdText);
while(!pRst->adoEOF)
{
strContext = (LPCSTR)_bstr_t(pRst->GetCollect("检查内容"));
strSelcet = (LPCSTR)_bstr_t(pRst->GetCollect("可选项"));
strTool = (LPCSTR)_bstr_t(pRst->GetCollect("工具"));
strData = strContext+"|"+strSelcet+"|"+strTool;
veData.push_back(strData);
pRst->MoveNext();
}
pRst->Close();
pConnect->Close();
return veData;
}[/size] DLL? vector? CString 析构
[解决办法]
我估计问题出在 EXTData::GetXlsxData 函数中
vector<CString> vSpcData;是局部变量, 在函数退出时会被解析
[解决办法]
跨模块传递字符串,不要选择CString,而应该选择基本数据类型,如char*,而且要做到哪个模块申请的,哪个模块中释放
我以前也遇到过这样的事,就长记性了
[解决办法]
http://cache.baiducontent.com/c?m=9d78d513d9d431db4f9a91690c66c0171f43f3622ba7a40208df8449e3732b47501593ac57250772a5d27d1716d94c4b9cf42102321454c78cc9f85dadbd855b589f2745215dc001498f4cbb8c067bce7ad61cabb81894a7ed77d6ebc5d3a8051188035b27d5e78b2d51499572b5436aa8f9841b550e4ae1a96778ff5b7429822145ab44f8fd31640681f2dd4b4cb470963e4f&p=9834c64ad4830aed08e2977f0b51cb&newp=c0769a4786cc42ae5ef3df3c1b449e231610db2151d0d61f&user=baidu&fm=sc&query=%BF%E7%C4%A3%BF%E9%B4%AB%B5%DD%D7%D6%B7%FB%B4%AE+cstring&qid=&p1=1
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104687270e54f7327d818c027fa3cf1fd5791d1c053db2fa3a221206d8c2776403bb0c01aaa63965477737c09edf893acaca943f5c893044040bf14a05d269b8bb4032b250872aeeb86f91adf043c2ef9493840806&p=882a9643d78a08ec00ab8c2d021492&newp=882a9643d79b02fc57efc93c525f86231610db2151d2d7102797&user=baidu&fm=sc&query=%BF%E7%C4%A3%BF%E9%B4%AB%B5%DD+cstring&qid=&p1=4
供参考,这种事情发生的很多的
[解决办法]
http://blog.163.com/zhaodali@126/blog/static/1393920582007514432792/
第11条