векторный дескриптор не работает в _CrtIsValidHeapPointer

0

Я новичок в 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', но он не срабатывает одинаково.

  • 1
    Это будет быстрый сбой, когда вызывающий и вызываемый не используют одну и ту же библиотеку времени выполнения Си. Требуется компиляция с / MD и точно такой же версией компилятора с точно такими же настройками.
  • 0
    Спасибо, это работает, но для отладки я использовал / MDd.
Показать ещё 1 комментарий
Теги:
vector
heap-corruption

1 ответ

1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню