2013-11-25 51 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*並提供複製/移動/分配。