2013-05-31 1 views
0

J'ai déclaré un vecteur du type suivant:Copie un vecteur et le code va à _CrtIsValidHeapPointer()

vector<CDFE> vDFE; 

où CDFE est une classe et il contient une double usage variable.

J'accède à travers un pointeur comme ci-dessous, par exemple .:

pDoc->vDFE.at(i).usage; 

Je crée comme ci-dessous un vecteur temporaire parce que je ne veux pas modifier vDFE.

vector<CDFE> tempDFE(pDoc->vDFE); 

Mais quand je lance le prog, il va à une fonction _CrtIsValidHeapPointer()

Qu'est-ce que je fais mal?

Votre aide est grandement appréciée.

Ce qui suit est un code:

class CDFE : public CRect 
{ 
    public: 
     CDFE(); 
     virtual ~CDFE(); 
     double usage; 
} 


void CRXView::OnDraw(CDC* pDC) 
{ 
    CRXDoc* pDoc = GetDocument(); 
    vector<CDFE> tempDFE(pDoc->vDFE); 
} 

CRXDoc* CRXView::GetDocument() const // non-debug version is inline 
{ 
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRXDoc))); 
    return (CRXDoc*)m_pDocument; 
} 
+2

Plusieurs raisons possibles, la corruption du tas n'est jamais si difficile. Regardez d'abord la Règle des Trois et assurez-vous de l'avoir appliqué sur votre classe CDFE et que son constructeur de copie et son opérateur d'affectation sont solides. –

+0

Est-ce que cela produit une erreur? Je crois que cette fonction est juste une vérification que le pointeur est valide. – Angew

+0

Quelle ligne déclenche le comportement? Pouvez-vous passer en revue avec le débogueur et voir exactement quelle ligne provoque votre programme à la faute? – Jimbo

Répondre

0

Je ne suis pas sûr ce que pDoc->DFE est en train de faire. Vous ne vouliez pas dire pDoc->vDFE?

Le message de débogage signale un problème de mémoire.

Avez-vous dimensionné le vecteur? Essayez, par exemple,

vector<CDFE> vDFE(10); 

Qui va créer un vecteur avec 10 CFDE construits par défaut.

Assurez-vous que je ne soit pas plus grand que 9.

+0

J'ai dimensionné vDFE à 100 et ne dépasse pas 60 à max. –

+0

J'ai besoin de plus d'informations. Qu'en est-il de "Je ne sais pas ce que fait pDoc-> DFE. N'avez-vous pas voulu dire pDoc-> vDFE?". Pourriez-vous inclure la déclaration CDFE? – Bathsheba

+0

J'ai maintenant inclus la déclaration. –

1

L'erreur est due à la corruption de mémoire. C'est généralement une mauvaise idée d'utiliser un vecteur avec un objet de classe sans utiliser de constructeur de copie. Dans ce cas, la même adresse mémoire peut être libérée plusieurs fois; conduisant à une corruption de mémoire possible.

Maintenant, il pourrait y avoir un autre problème possible, par exemple si vous compilez ceci en tant que DLL alors il pourrait également survenir une corruption de tas selon la manière dont vous avez lié le code avec un autre module/application.

Espérons que cela aide, ce qui concerne.

+0

Merci pour votre réponse. ce n'est pas une DLL. Comment résoudre le problème du constructeur de copie? Merci encore –

+0

vérifier le lien http://www.cplusplus.com/articles/y8hv0pDG/ Section: Quand dois-je écrire un constructeur de copie? exécutez-vous l'une des opérations pouvant survenir le problème? btw, est-ce une application autonome? cause la corruption de tas peut se produire à la bibliothèque liée statiquement aussi (pas seulement dll). – fadedreamz

Questions connexes