2 Stimmen

Übertragen des Vektors von Objekten zwischen C++ DLL und Cpp/CLI-Konsolenprojekt

Ich habe eine C++-Bibliotheksanwendung, die mit einem C++-Server kommuniziert, und ich erstelle einen Vektor meiner benutzerdefinierten Klassenobjekte. Aber meine Cpp/CLI-Konsolenanwendung (die mit nativem C++ interagiert) wirft einen Speicherverletzungsfehler aus, wenn ich versuche, meinen benutzerdefinierten Klassenobjektvektor zurückzugeben.

Code-Beispiel -

In meiner nativen C++-Klasse -

std::vector GetStuff(int x)
{
   -- Arbeit erledigen
   std::vector vec;
   A a;
   vec.push_back(a);
--- mehr A-Objekte hinzufügen
   return vec;
}

In meiner Cpp/CLI-Klasse

public void doStuff() { std::vector vec; vec = m_nativeCpp->GetStuff(4); // wobei nativeCpp eine dynamisch allokierte Klasse in der nativecpp DLL ist, die Anwendung wirft hier einen Speicherverletzungsfehler aus! }

exakte Fehlermeldung

Ein unbehandelte Ausnahme vom Typ 'System.AccessViolationException' ist aufgetreten in CLIConsole.exe - was mein Konsolenprojekt in cpp/CLI ist.

Zusätzliche Informationen: Es wurde versucht, auf geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist.

2voto

vava Punkte 23765

Werfen Sie einen Blick auf diesen Support-Artikel. Ich denke, was passiert, ist, dass Ihr Vektor in CLI versucht, auf interne Vektordaten aus DLL zuzugreifen und dies aufgrund unterschiedlicher statischer Variablen fehlschlägt. Ich vermute, die einzige gute Lösung besteht darin, einfaches Array durch DLL-Grenzen zu übergeben, &vector[0] gibt es zurück.

Aber es könnte auch etwas Magie in den Kopierkonstruktoren der Klasse A geben. Wenn sie fehlen und die Klasse Zeiger als Mitglieder hat, könnten Sie leicht den gleichen Fehler bekommen.

2voto

Hans Passant Punkte 894572

Ich gehe davon aus, dass der Native-Code in einer separat kompilierten Einheit vorliegt, wie z.B. einer .dll. Das erste, worüber man sich Sorgen machen muss, ist der Native-Code, der einen anderen Allokator (new/delete) verwendet. Das tritt auf, wenn er mit /MT kompiliert wird oder mit einer anderen Version der CRT verknüpft ist.

Als nächstes sollten Sie sich um das Debugging von STL-Iteratoren kümmern. Stellen Sie sicher, dass beide Module mit der gleichen Einstellung für _HAS_ITERATOR_DEBUGGING kompiliert wurden. Sie werden nicht übereinstimmen, wenn der Native-Code mit einer alten Version der CRT erstellt wurde oder sich im Release-Modus befindet.

0voto

Frederick The Fool Punkte 33140

Ich bin mir nicht sicher, aber das könnte funktionieren: Anstatt einen Vektor zurückzugeben, erstellen Sie den Vektor im Heap und geben Sie einen Zeiger darauf zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X