2010-12-27 8 views
1

Ja. Ich kann nicht sehen, was ich falsch mache.Karte mit String ist kaputt?

Die Karte wird: string, int

Hier ist die Methode

bange::function::Add(lua_State *vm){ 
//userdata, function 
if (!lua_isfunction(vm, 2)){ 
    cout << "bange: AddFunction: First argument isn't a function." << endl; 
    return false;} 
void *pfunction = const_cast<void *>(lua_topointer(vm, 2)); 
char key[32] = {0}; 
snprintf(key, 32, "%p", pfunction); 
cout << "Key: " << key << endl; 
string strkey = key; 
if (this->functions.find(strkey) != this->functions.end()){ 
    luaL_unref(vm, LUA_REGISTRYINDEX, this->functions[strkey]);} 
this->functions[strkey] = luaL_ref(vm, LUA_REGISTRYINDEX); 
return true; 

Ok, wenn der Code ausgeführt wird, es stürzt ab und druckt diese Ausgabe:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff6e6caa9 in std::basic_string<char, std::char_traits<char>, std::allocator<char> > 
::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const() from /usr/lib/libstdc++.so.6 

Im Ernst, was ist falsch mit meinem Code. Danke für die Hilfe.

Edit 1:

Ok, habe ich die Lösung getan und immer noch nicht. Ich habe versucht, direkt eine Zeichenfolge einzufügen, aber es gibt den gleichen Fehler.

Mal sehen, das Objekt ist ein bange::scene geerbt von bange::function. Ich schaffe das Objekt mit lua_newuserdata:

bange::scene *scene = static_cast<bange::scene *>(lua_newuserdata(vm, sizeof(bange::scene))); 
(...) 
scene = new (scene) bange::scene(width, height, nlayers, vm); 

Ich brauche dies für Lua Garbage Collection. Jetzt ist der Zugriff auf bange::function::Add von Lua:

static int bangefunction_Add(lua_State *vm){ 
    //userdata, function 
    bange::function *function = reinterpret_cast<bange::function *>(lua_touserdata(vm, 1)); 
    cout &lt&lt "object with bange::function: " &lt&lt function << endl; 
    bool added = function->bange::function::Add(vm); 
    lua_pushboolean(vm, static_cast<int>(added)); 
    return 1; 
} 

Userdata- bange::scene ist in Lua gespeichert. Zu wissen, dass die Userdata-Szene in Wirklichkeit die Richtung des Objekts ist, ist dieselbe, wenn ich die Szene zuvor erstellt habe. Ich brauche die reinterpret_cast, und rufen Sie dann die Methode auf. Der Zeiger "dies" ist innerhalb der Methode immer noch dieselbe Richtung.

gelöst

ich einen kleinen Test im bange::function Konstruktor tat das ohne Probleme funktioniert.

bange::function::function(){ 
    string test("test"); 
    this->functions["test"] = 2; 
} 

Ich bemerkte schließlich, dass das Problem

bange::function *function = reinterpret_cast<bange::function *>(lua_touserdata(vm, 1));

ist, da das Objekt bange::scene und kein bange::function (ich gebe es zu, ein Zeiger Korruption) ist, und dies scheint ein Code Design-Problem. Das ist also in gewisser Weise gelöst. Danke an alle.

+1

auf welcher Linie tut Ihr Code Absturz? – Jaywalker

Antwort

1

Da strkey ist die einzige Zeichenfolge, die Sie jemals vergleichen, muss es die Ursache der Probleme sein, und es stammt aus dem char [] auf dem Stapel. Ich würde damit anfangen, das loszuwerden.

std::stringstream str; 
str << pfunction; 
string strkey = str.str(); 

Natürlich könnte dieser Fehler auch auftreten, wenn Sie beschädigt this, oder wirklich, wenn Sie nur flach heraus beschädigt den Heap überall und jederzeit.

1

Mit diesem Code ist möglicherweise nichts falsch.

Ein Segmentierungsfehler tritt auf, wenn Ihr Code versucht, in den Speicher zu lesen oder zu schreiben, der nicht Ihrem Prozess zugeordnet ist. Der Punkt, an dem es passiert, hängt möglicherweise nicht mit dem Fehler zusammen.

An einem bestimmten Punkt in Ihrem Programm, vor der Segmentierung Fehler, einige Code Munged den Haufen.Dies könnte

sein
  1. Zugriff auf ein gelöschtes/befreit Zeiger
  2. Grenzen eines Arrays Überschreibung
  3. ein Objekt in die falsche Art Casting und es

Keines dieser Dinge verwendet, hat sofort zum Absturz - Sie könnten die Erinnerung einfach stumm machen. Zu einem späteren Zeitpunkt, wenn dieser Speicher verwendet wird, stürzt es möglicherweise auch nicht ab (nur anderen Speicher wird automatisch beschädigt). Irgendwann stürzt man ab, aber dieser Punkt ist möglicherweise völlig unabhängig von dem Problem.

Die Strategie für das Debuggen besteht darin, die erste Korruption zum Absturz zu bringen. Es gibt ein paar Möglichkeiten, dies zu tun.

  1. Verwenden Sie einen Debug-Heap. Hier sind einige Möglichkeiten für GCC auf Linux Debug heap/STL debugging equivalent for GCC?

  2. Valgrind: http://valgrind.org/