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