Я новичок в c++, нужно использовать его только для создания расширения пространства имен оболочки для приложения С#.
У меня есть следующий код:
#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'
, но он не срабатывает одинаково.
FTPSITEACCESS
будет скопирован. Копия ctor не показана, но мой хрустальный шар говорит мне, что он сломан.
Если вы используете С#, просто используйте класс std::string
в C++. strdup
и new[]
являются примитивными операциями, которые делают вас ответственными за управление памятью, и вы действительно хотите этого избежать. Причина в том, что вам не нужно писать копию ctor для класса, если все члены имеют рабочую копию ctor (и аналогично для назначения и перемещения). Но если у вас есть хотя бы один член char*
, вам вдруг придется написать все это. Класс std::string
имеет одну главную ответственность: инкапсулировать один char*
и предоставить копию/перемещение/назначение.