2013-11-25 47 views
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'之前将其删除,但它以相同的方式失败。

+1

当调用者和被调用者不使用相同的C运行时库时,这将会快速崩溃。使用/ MD编译和完全相同的编译器版本需要完全相同的设置。 –

+0

谢谢,它的工作原理,但为了调试我用/ MDd。 – m3f

+0

C++通常显示问题的结果,而不是原因,与c#相比,这是巨大的时间损失。 – m3f

回答

1

FTPSITEACCESS将被复制。副本未显示,但我的水晶球告诉我它已损坏。

如果您来自C#,只需使用C++中的std::string类即可。 strdupnew[]是原始操作,它们使您对内存管理负责,并且您确实想避免这种情况。原因是,如果所有成员都有工作副本(并且类似于分配和移动),则不需要为班级编写副本。但是如果你有一个单一的char*会员,你突然必须写下所有这些。 std::string类有一个主要职责:封装一个char*并提供复制/移动/分配。