GraphViz crasht beim Aufräumen
-
Hallo,
ich schreibe gerade einen Wrapper, um die GraphViz-Bibliothek in C# zu verwenden. Das Problem betrifft aber den C++-Code. Und zwar verwende ich die Funktion 'gvFreeLayout', um den Graph zu löschen. AFAIK ist das auch korrekt. Allerdings wird aus dieser Funktion heraus irgendwann 'free' aufgerufen und dann knallt's. Scheinbar bin ich aber der einzige mit dem Problem und bei anderen Programmen, die auf GraphViz zugreifen, existiert das Problem auch nicht. Das könnte allerdings daher liegen, dass diese Programme eine ältere Version zu verwenden scheinen (Ich verwende die stabile Version für Windows 2.12 als statische Library).
Besonders komisch ist, dass der Fehler nicht immer auftritt sondern nur, wenn ich einen speziellen Graph parse, der aber wie gesagt bei anderen GraphViz-Anwendungen keine Fehler erzeugt.
Leider ist die Struktur meines Codes etwas kompliziert, weil es sich dabei eben um eine DLL handelt, die mehrere GraphViz-Kontexte verwalten können soll. Ich versuche trotzdem mal, den relevanten Ausschnitt zu posten. Das ist im wesentlichen folgende Klasse:
typedef char* handle_t; struct graphviz_exception { }; struct dll_instance { handle_t handle; GVC_t* context; graph_t* graph; string result; dll_instance(handle_t handle) : handle(handle) , context(gvContext()) , graph(0) { } private: // Forbid copies! dll_instance(dll_instance const&) { } dll_instance& operator =(dll_instance const& other) { } public: ~dll_instance() { release(); } bool is_active() { return handle != 0; } void create_graph(char const* dot_cmd, char const* engine) { release_graph(); if (not (graph = agread(memory_read_stream(dot_cmd)))) throw graphviz_exception(); if (gvLayout(context, graph, engine ? engine : "dot") != 0) throw graphviz_exception(); } void release() { if (not is_active()) return; release_graph(); handle = 0; if (gvFreeContext(context) != 0) throw graphviz_exception(); } void release_graph() { if (not graph) return; // ******** In der folgenden Zeile crasht es! if (gvFreeLayout(context, graph) != 0) throw graphviz_exception(); agclose(graph); graph = 0; } void render(char const* format) { memory_write_stream ret; if (gvRender(context, graph, format ? format : "plain", ret) != 0) throw graphviz_exception(); result = ret.value(); } };'memory_read_stream' und 'memory_write_stream' sind selbstgeschriebene Klassen, die einen FILE*-Stream kapseln.
Der Aufruf erfolgt nun in etwa folgendermaßen (es ist etwas komplizierter aber im Prinzip läuft das schon so ab):
dll_instance context(handle_t(1)); std::string code = "Der zu lesende DOT-Code"; context.create_graph(code.c_str(), "dot"); context.render("plain-ext"); std::string str_result = context.result; std::cout << str_result << std::endl; context.release();Zu guter letzt noch der Code des Graphen, der den Fehler erzeugt:
graph ER { node [shape=box]; course; institute; student; node [shape=ellipse]; {node [label="name"] name0; name1; name2;} code; grade; number; node [shape=diamond,style=filled,color=lightgray]; "C-I"; "S-C"; "S-I"; name0 -- course; code -- course; course -- "C-I" [label="n",len=1.00]; "C-I" -- institute [label="1",len=1.00]; institute -- name1; institute -- "S-I" [label="1",len=1.00]; "S-I" -- student [label="n",len=1.00]; student -- grade; student -- name2; student -- number; student -- "S-C" [label="m",len=1.00]; "S-C" -- course [label="n",len=1.00]; label = "\n\nEntity Relation Diagram\ndrawn by NEATO"; fontsize=20; }/EDIT: Der Fehler scheint durch das Label verursacht zu werden. Wenn ich die letzten zwei Anweisungen in der DOT-Datei lösche, tritt der Fehler nicht mehr auf.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
C++ Forumbot schrieb:
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Okay, ich hatte mich schon gewundert, dass es kein Forum für spezielle 3rd-Party-Bibliotheken gibt.