2016-05-31 8 views
1

Die Struktur ist definiert als solche struct:Valgrind klagt über ungültige Lese wenn struct Mitglied durch Zeiger Zugriff

struct section_{ 
    int start; 
    ... 
}; 

Aus Gründen werde ich nicht gehen, ich brauche einen Zeiger auf die Struktur an eine Funktion zu übergeben das akzeptiert eine void*. Die Funktion sieht wie folgt aus:

void* my_fun(void* sec){ 
    section_* section = (section_*)sec; 
    int start = section->start; // <---- valgrind complains here 
    ... 
} 

Ich habe einen std::vector<section_*> und ich brauche my_fun auf jedes der Elemente dieses Vektors zu nennen. Ich tue dies, wie so:

std::vector<section_*> sections = get_sections(); 
for (int i = 0; i < sections.size(); ++i){ 
    my_fun((void*)sections[i]); 
} 

Die get_sections() Funktion sieht ungefähr so ​​aus:

std::vector<section_*> get_sections(){ 
    std::vector<section_*> sections; 
    section_ sec1; 
    sec1.start = 0; 
    ... 
    sections.push_back(&sec1); 
    return sections; 
} 

ich das Problem auf der Linie in my_fun die

int start = section->start; 

Der Fehler sagt verfolgt haben sagt:

==3512== Invalid read of size 4 
==3512== at 0x41A970: my_fun(void*) 
... 
==3512== Address 0xffeffa2a0 is on thread 1's stack 
==3512== 14160 bytes below stack pointer 

Auch wenn ich eine ungültige Lese bin immer, bin ich noch in der Lage, die Mitglieder der Struktur innerhalb my_fun zugreifen und sie sind die richtigen Werte. Warum das?

Mir ist klar, dass dieser Code in kleine Stücke, aber der eigentliche Code ist viel komplexer und langwieriger als das, was ich zeige, obwohl ich denke, dass ich alle relevanten Teile bin zeigen. Ich hoffe, dass die Informationen, die ich gab, genug sind.

+0

haben Sie versuchen, mithilfe von [static_casting] (http://www.cplusplus.com/doc/tutorial/typecasting/) Es sieht aus wie ein Guss Problem. – Vtik

+0

@Vtik Ich habe das noch nie zuvor benutzt ... Ich werde das untersuchen. Danke – asrjarratt

+1

Diese 'sections.push_back (&sec1); return sections;' gibt einen Zeiger auf eine lokale Variable. Wie die Nachricht sagt * == 3512 == Adresse 0xffeffa2a0 ist auf Thread 1's Stack * –

Antwort

2

Wie in den Kommentaren von @BoPersson erwähnt, fügen Sie eine lokale Variable auf den Vektor:

std::vector<section_*> get_sections(){ 
    std::vector<section_*> sections; 
    section_ sec1; // <- Local, temporary variable 
    sec1.start = 0; 
    ... 
    sections.push_back(&sec1); // <- Address of local var 
    return sections; 
    // When this function ends, sec1 is no longer valid 
} 

Sie entweder new können sec1 (delete es später ing) zu erstellen. Oder ändern Sie den Vektortyp zu std::vector<section_> sections;.

+0

Auch, warum konnte ich auf die Struktur Mitglieder zugreifen (die richtigen Werte geben), wenn 'Sec1' nicht mehr gültig war? – asrjarratt

+0

Ok, das macht Sinn wenn ich den Vektortyp std :: vector Abschnitte ändern, kann ich pass & Abschnitte [i] my_fun, ja? – asrjarratt

+1

Sie haben einfach Glück zu bekommen. [diese Antwort] (http://stackoverflow.com/a/6445794/669.576) könnte helfen. –