2014-09-15 2 views
0

J'utilise Visual Studio 2013. J'obtiens l'erreur Access violation reading location 0xCDCDCDD1. Les références de Wikipedia: Magic Numbers, here, et this question me disent que j'utilise un pointeur non initialisé. Je pense que le problème est avec la fonction malloc que j'utilise, bien que je me suis référé au doc ​​CPlusPlus avant de l'utiliser.Accédez à l'emplacement de lecture de violation 0xCDCDCDD1

Mon code:

#include "SingleNode.h" 
#include "SingleList.h" 
#include <iostream> 
SingleList::SingleList() {} 
SingleList::~SingleList() {} 
... 
    void SingleList::addHead(int value){ 
    ISingleNode *temp1 = (ISingleNode *)malloc(sizeof(SingleList)); 
    head = NULL; 
    temp1->setValue(value); 
    temp1->setNext(head->getNext()); 
    if (!head->getNext()) 
    { 
     head = temp1; 
    } 
    else 
    { 
     temp1->setNext(head->getNext()); 
     head = temp1; 
    } 
} 

    ... 

L'erreur est dans la ligne temp1->setValue(value);

La fonction setValue(int value) est inclus d'ici:

#include "SingleNode.h" 
SingleNode::SingleNode() {} 
SingleNode::~SingleNode() {} 
void SingleNode::setValue(int value){ 
    this->value = value; 
} 
int SingleNode::getValue(){ 
    return value; 
} 
ISingleNode * SingleNode::getNext(){ 
    return next; 
} 
void SingleNode::setNext(ISingleNode * next){ 
    this->next = next; 
} 

SingleNode.h:

#pragma once 
#include "Interfaces01.h" 
class SingleNode :public ISingleNode{ 
private: 
    int value; 
    ISingleNode * next = NULL; 
public: 
    SingleNode(); 
    ~SingleNode(); 
    void setValue(int value); 
    int getValue(); 
    ISingleNode * getNext(); 
    void setNext(ISingleNode * next); 
}; 

SingleList.h:

#pragma once 
#include "Interfaces01.h" 
class SingleList :public ISingleList{ 
private: 
    int value; 
    ISingleNode * head=NULL; 
    ISingleNode * temp=NULL; 
    ISingleNode * next=NULL; 
    ISingleNode * temp1; 
public: 
    SingleList(); 
    ~SingleList(); 
    ISingleNode * getHead(); 
    void setHead(ISingleNode * head); 
    void addHead(int value); 
    void orderSort2(); 
    void orderSort3(); 
    void sequenceOrderSort(); 
    void reverse(); 
    ISingleNode * swap(ISingleNode * head, int k); 
    ISingleNode * get_node(ISingleNode * head, int k); 
}; 

En rupture à la ligne, le débogueur me montre les valeurs suivantes:

Visual Studio 2013 debug values at breakpoint

+3

Pourquoi vous utilisez les appels de bibliothèque C comme 'malloc' en C++? –

+0

http://stackoverflow.com/a/127404/487892 – drescherjm

Répondre

5
  1. Change:

    ISingleNode *temp1 = (ISingleNode *)malloc(sizeof(SingleList)); 
    

    en :

    ISingleNode *temp1 = new SingleList; 
    
  2. Vous accédez à un pointeur NULL:

    head = NULL; // set to NULL 
    temp1->setValue(value); 
    temp1->setNext(head->getNext()); // oops! 
    

    vous avez probablement voulu dire:

    void SingleList::addHead(int value) 
    { 
        ISingleNode *temp1 = new SingleList; 
        temp1->setValue(value); 
        temp1->setNext(head); 
        head = temp1; 
    } 
    
Questions connexes