2013-11-25 2 views
0

Я новый для C++, нужно использовать его только для создания расширения пространства имен оболочки для приложения C#.векторный дескриптор не работает в _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() return vector<FTPSITEACCESS>*, а также vector<FTPSITEACCESS*>*, а затем удалить его до 'return hr', но он не работает таким же образом.

+1

Это будет быстрый сбой, когда вызывающий и вызываемый не используют одну и ту же библиотеку времени выполнения C. Требуется компиляция с/MD и точная версия компилятора с одинаковыми настройками. –

+0

Спасибо, это работает, но для отладки я использовал/MDd. – m3f

+0

C++ как обычно показывает результат проблемы, а не причину, которая представляет собой огромный штраф времени, по сравнению с C#. – m3f

ответ

1

FTPSITEACCESS будет скопирован. Копия ctor не показана, но мой хрустальный шар говорит мне, что он сломан.

Если вы используете C#, просто используйте класс std::string в C++. strdup и new[] - примитивные операции, которые делают вас ответственными за управление памятью, и вы действительно хотите этого избежать. Причина в том, что вам не нужно писать копию ctor для класса, если все члены имеют рабочую копию ctor (и аналогично для назначения и перемещения). Но если у вас есть хотя бы один член char*, вам придется написать все это. Класс std::string несет основную ответственность: инкапсулировать один char* и предоставить копию/перемещение/присвоение.

Смежные вопросы