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.
haben Sie versuchen, mithilfe von [static_casting] (http://www.cplusplus.com/doc/tutorial/typecasting/) Es sieht aus wie ein Guss Problem. – Vtik
@Vtik Ich habe das noch nie zuvor benutzt ... Ich werde das untersuchen. Danke – asrjarratt
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 * –