0
我剛剛對C++新手,只需使用它來爲c#應用程序創建shell命名空間擴展。矢量desctructor在_CrtIsValidHeapPointer失敗
我有下面的代碼:
#ifdef MAKEDLL
# define DLLEXPORT __declspec(dllexport)
#else
# define DLLEXPORT __declspec(dllimport)
#endif
//...
DLLEXPORT class NativeFtp
{
public:
DLLEXPORT void Initialize(string uniqeId);
DLLEXPORT vector<FTPSITEACCESS> GetSites();
} _NativeFtp;
//...
vector<FTPSITEACCESS> NativeFtp::GetSites()
{
vector<FTPSITEACCESS> vec;
FTPSITEACCESS st;
st.SiteName = "ftp://10.20.3.251/";
st.Password = "";
st.Login = "";
vec.push_back(st);
return vec;
}
其他庫:
STDMETHODIMP CShellFolderImpl::EnumObjects (HWND hwndOwner, DWORD dwFlags,
LPENUMIDLIST* ppEnumIDList)
{
// Skipped
vector<FTPSITEACCESS> ftpSites = m_ftp.GetSites();
vector<char*> names;
/*for(vector<FTPSITEACCESS>::iterator it = ftpSites.begin(); it != ftpSites.end(); ++it) {
//char* ch = new char[(*it).SiteName.size()+1];
//ch[(*it).SiteName.size()] = '/0';
//std::copy((*it).SiteName.begin(),(*it).SiteName.end(),ch);
//names.push_back(strdup(ch)); //TODO:FREE
}*/
// Skipped
return hr;
}
此代碼對'return hr'
未能在_CrtIsValidHeapPointer
由向量的析構函數調用。 我試圖讓NativeFtp::GetSites()
返回vector<FTPSITEACCESS>*
以及 vector<FTPSITEACCESS*>*
然後在'return hr'
之前將其刪除,但它以相同的方式失敗。
當調用者和被調用者不使用相同的C運行時庫時,這將會快速崩潰。使用/ MD編譯和完全相同的編譯器版本需要完全相同的設置。 –
謝謝,它的工作原理,但爲了調試我用/ MDd。 – m3f
C++通常顯示問題的結果,而不是原因,與c#相比,這是巨大的時間損失。 – m3f