Domanda

Ho un problema con un'eccezione di violazione di accesso. Sto usando ITK e leggere un file con il lettore di file, di.

ThreeDImageFloatType* MyClass::loadImage(std::string filename){
const char* cfilename = filename.c_str();
fileReader = ImageFileReaderType::New();
fileReader->SetFileName(cfilename);

try{ 
    fileReader->Update();
}catch( ... ) {
    std::cerr << "failed to read file " << filename << std::endl; 
}

CastFilterType::Pointer castFilter = CastFilterType::New();
castFilter->SetInput(fileReader->GetOutput());


castFilter->Update();

//ThreeDImageFloatType *t3dim = castFilter->GetOutput();
t3dim = castFilter->GetOutput();
return t3dim;
}

Questa è una funzione della classe contiene anche 2 variabili globali:

ImageFileReaderType::Pointer fileReader;
ThreeDImageFloatType *t3dim;

Ora, se si chiama la funzione nella classe da per esempio il mio metodo principale e tenta di accedere al valore di ritorno, qualcosa come t3dim->GetLargestPossibleRegion().GetSize();. Ottengo un errore di violazione di accesso. E 'importante notare se non esternalizzare il codice, e avremo entro il metodo principale, funziona come un fascino. Quale potrebbe essere il problema? Come posso risolvere questo?

[modifica] Ho provato a sostituire il nome del file stringa con un const char * filename. Il metodo principale appare così.

MyClass imIO;

const char* filename = "path to file";
ThreeDImageFloatType *t3dim = imIO.loadImage(filename);
t3dim->GetLargestPossibleRegion().GetSize();

Anche se metto il codice della funzione completamente nel metodo principale funziona.

[/ modifica]

[offtopic] forse un moderatore può etichettare come ITK, in quanto si tratta di una domanda specifica ITK? [/ Offtopic]

È stato utile?

Soluzione

Ho appena trovato la risposta me stesso. La soluzione per le bugie problema entro questa linea:

fileReader = ImageFileReaderType::New();

E 'un puntatore intelligente. Così, quando la funzione ritorna, diventa non registrato. Così il puntatore ricevuto da quella funzione a un buffer interno (il file in lettura), non possono più essere utilizzate. Mentre i punti di puntatore alla memoria reale, non si può accedere più. Errore di violazione di accesso.

Altri suggerimenti

L'unico problema che vedo è che si sta passando filename dalla copia alla funzione. Il puntatore ricevuto dalla chiamata a c_str() non è valida una volta che la funzione ritorna.

È ImageFileReaderType mantenendo un riferimento a questo puntatore e usarlo nella chiamata a GetSize()?

Se è così, allora si potrebbe desiderare di provare qualche altro stategy per mantenere la variabile filename vivo tutta la vita di t3dim.

Follow-up per l'aggiornamento : questo può suonare come un altro tentativo stupido, ma si fa a controllare per puntatori nulli? Sei che che tutti i ritorni GetOutput()methods oggetti validi? Un sacco di librerie C ++ (purtroppo) preferiscono tornare puntatori nulli per generare eccezioni ...

Dato che lei ha detto che se si mette tutto in main() funziona, suppongo ci sia qualche sottigliezza succedendo nella vostra trasformazione per ottenere il codice corrente. Possiamo vedere entrambi i campioni per confrontare?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top