Перенос вектора объектов между C ++ DLL и консольным проектом Cpp / CLI - PullRequest
2 голосов
/ 04 февраля 2009

У меня есть приложение библиотеки C ++, которое общается с сервером C ++, и я создаю вектор своих пользовательских объектов класса. Но мое консольное приложение Cpp / CLI (которое взаимодействует с собственным C ++) выдает ошибку нарушения памяти, когда я пытаюсь вернуть свой пользовательский класс obj vector.

Пример кода -

В моем родном классе C ++ -

std::vector<a> GetStuff(int x)
{
   -- do stuff
   std::vector<a> vec;
   A a;
   vec.push_back(a);
--- push more A objs
   return vec;
}

В моем классе Cpp / CLI

public void doStuff()
{
   std::vector<a> vec;
   vec = m_nativeCpp->GetStuff(4);   // where nativeCpp is a dynamically allocated class in nativecpp DLL, the app throws up a memory violation error here!
}

точное сообщение об ошибке

Произошло необработанное исключение типа 'System.AccessViolationException' в CLIConsole.exe - это мой консольный проект cpp / CLI

Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2009

Взгляните на эту статью поддержки . Я думаю, что происходит, что ваш вектор в CLI пытается получить доступ к внутренним векторным данным из DLL и не может этого сделать из-за различных статических переменных. Полагаю, что единственным хорошим решением является пропуск простого массива через границы DLL, &vector[0] возвращает его.

Но в конструкторах копирования класса A может также происходить какое-то волшебство. Если они отсутствуют, и у класса есть указатели в качестве членов, вы можете легко получить ту же ошибку.

2 голосов
/ 05 февраля 2009

Я предполагаю, что нативный код находится в отдельно скомпилированном модуле, например .dll. Первое, о чем беспокоится, это собственный код, использующий другой распределитель (new / delete), вы получите его, когда он скомпилирован с / MT или связан с другой версией CRT.

Следующее, о чем нужно беспокоиться, это отладка итератора STL. Вы должны убедиться, что оба модуля были скомпилированы с одинаковыми настройками для _HAS_ITERATOR_DEBUGGING. Они не будут одинаковыми, если нативный код был собран со старой версией CRT или версии Release build.

0 голосов
/ 04 февраля 2009

Я не уверен, но это может сработать: вместо возврата вектора создайте вектор в куче и верните указатель на него.

...