2012-11-21 5 views
5

Voglio chiederti un suggerimento, dato che sono un principiante e non ho trovato nessuna risposta adatta in internet. sto ottenendo questo errore: di debug Asserzione non riuscita - mappa/set iteratore non dereferencable alla linea che assomiglia a questo:C++ map/set iteratore non dereferibile

pointA = active->pointNext(timeNext); 

con la funzione pointNext() come la vedo io è tutto ok , e quello che riguarda attiva, ho:

active = setS.data.end(); 

qualche informazione in più:

attiva è multinsieme < classA, ClassB :: ClassC> :: const_iterator

imposta ha: setS.Q, setS.W, setS.T e setS.data, per cui setS.data ha 0 in parentesi quadre. Quando ho la dichiarazione iteratore multiset nel file .cpp, durante il debug non posso entrare per vedere cosa è dentro attivo, quando è nel file .h, posso farlo.

Avendo in .cpp non riesco a inserire attivo, quindi posso immaginare che è come puntatore (iteratore) non può dereferenziare, perché è sbagliato dentro. Cosa succede se è vuoto, cioè se setS.data è vuoto? o se c'è della spazzatura dentro?

So che la cosa era in esecuzione sotto Linux in precedenza, c'è qualche funzionalità che devo cambiare per l'esecuzione su Windows forse? Ad esempio, per modificare un numero di parametri del modello su uno solo? (Correttamente attribuire setS.data a attiva, perché io non sono sicuro - lo faccio correttamente

Siamo spiacenti per questo post piuttosto caotica, ho voluto aggiungere la mia ipotesi che qualcuno li trascurare se? Se qualcosa qui non è chiaro o la mancanza di alcune informazioni, lo aggiungerò volentieri Puoi dirmi quali motivi potrebbero causare l'errore di dereferenziabilità che ottengo e dove dovrei cercarlo? Perché sono bloccato e non voglio t sapere come procedere.

alcun aiuto molto apprezzato, grazie!

risposta

9

Piuttosto s implica, dal momento che active punti al end() del contenitore, non è consentito dereferenziarlo.

I know the thing was running under linux previously

Se il codice è stato esattamente come questo ed è stato "in esecuzione", tutto questo significa che l'errore non si è mai manifestata in un modo che hai notato.

+0

certo, ora capisco. Potete spiegarmi se ho: 'multiset :: const_iterator attivo;' 'SomeClass setS;' 'std :: multiset data;' (l'ultimo come membro pubblico di una classe che si trova nello spazio dei nomi vlr) -> quale è esattamente il primo parametro del template per il multiset e il secondo? Ho la sensazione di non capire esattamente cosa viene ascritto, forse dopo qualche spiegazione potrei trovare più errore. Grazie! – berndh

+0

@eco_student: il secondo parametro di un set è il tipo utilizzato per confrontare gli oggetti del primo parametro. Ricorda che il set è un contenitore ordinato, quindi qui 'classB :: classC' è un tipo di comparatore che può confrontare oggetti di tipo' classA'. Vedi: http://www.sgi.com/tech/stl/multiset.html –

1

Non è possibile annullare il rederence dell'iteratore restituito dalla funzione end() di una libreria standard, poiché questo è "uno dopo l'ultimo elemento". Tipicamente si itererà sull'intervallo valido, ad es.fermandosi prima di raggiungere end():

for(someIteratorType it = setS.data.begin(); it != setS.data.end(); ++it) 
{ 
    it->someMethod(); 
} 

Oppure, in C++ 11, punti

for (const auto& elem : setS.data) 
{ 
    elem.someMethod(); 
} 
+0

ah scusa per questo, come ho detto sono un principiante. Quindi per ora ho concluso ** end() ** in ** begin() ** e ho provato questo iteratore in un'espressione: 'newSet.insert (* active)', e ottengo lo stesso errore! Come ho detto in ** setS.data ** era 0, ma in ** attivo ** sono stati assegnati alcuni numeri strani. Significa che il mio problema è, c'è il cestino in ** attivo **? – berndh

+0

@ user1578163 forse puoi mostrare il problema con qualche codice? È difficile capire quale sia il problema altrimenti. – juanchopanza

+0

'active = setS.data.begin();' 'newSet.insert (* attivo);' 'pointA = active-> pointNext (timeNext);' Ho ora questo errore nella seconda riga. quindi mi chiedo se la causa sia vuota ** setS.data ** (e numeri come -6.2774385622041925e + 066 in ** active ** dal nulla), e se dovrei iniziare a entrare in complicati ** dati ** inoltre, o il problema è da qualche altra parte. cosa ne pensi? – berndh

0

end() per l'elemento, dopo l'ultimo elemento. così end() non è dereferenziabile.

È necessario aggiungere un assegno per verificare se si è alla fine e, in tal caso, non deviarlo.

1

Questo è il vostro problema:

active = setS.data.end(); 

Ciò restituisce un iteratore ad una passata alla fine del contenitore.
Pertanto l'elemento a cui punta non è valido. Non è possibile chiamare alcun metodo sull'oggetto a cui fa riferimento anche l'iteratore.

se si fosse realizzato:

active = setS.data.end(); 
if (setS.data.begin() != active) 
{ 
    // make sure the set is not empty first 
    --active; 
    active->methodCall(); // This would be OK 
} 
0
pointA = active->pointNext(timeNext); 

tentativi deve risolvere il riferimento "attivo" per chiamare operator -> (...) su di esso, ma attivo è pari a setS.data.end() ;

end() restituisce un iteratore all'elemento dopo alla fine del contenitore. Pertanto, non puoi dereferenziarlo.