Исключение, выданное в 0x793F3729 (vcruntime140d.dll) в filePath.exe: 0xC0000005: Место записи нарушения прав доступа 0xCDCDCDCD - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь реализовать связанный список в виде стека, поэтому я создал для него специальный класс в C ++. Ниже приведено то, что я использовал для помещения переменной * temp1 в стек. Моя текущая проблема - когда я помещаю sh в стек, оно выдает исключение.

cityNode temp1(dest, cost + dataVector[index].cost, time + dataVector[index].time);
stack->pushCity(temp1);

Это узел.

class cityNode {
    public:
        string name;                        // City name
        double totalCost;                   // Total cost of the flight
        int totalTime;                      // Total time of the flight
        cityNode* destCity;                 // Pointer to the next destionation city

        cityNode(string cityName, double cityCost, int cityTime) {
            name = cityName;
            totalCost = cityCost;
            totalTime = cityTime;
            destCity = nullptr;
        }
};

Ниже приведен мой код. В настоящее время возникает исключение, когда оно достигает части кода newCity->totalCost = cityNode.totalCost;.

class CityStack {
    public:
        class cityNode* top = NULL;
        void pushCity(cityNode cityNode) {
            class cityNode* newCity = (class cityNode*) malloc(sizeof(class cityNode));
            newCity->name = cityNode.name;
            newCity->totalCost = cityNode.totalCost;            // Exception Thrown
            newCity->totalTime = cityNode.totalTime;
            newCity->destCity = top;
            top = newCity;
        }

        void popCity() {
            if (top == NULL) {
                cout << "Stack Underflow" << endl;
            }
            else {
                top = top->destCity;
            }
        }

        bool emptyCity() {
            if (top == NULL)
                return true;
            else
                return false;
        }

        void reverseCity() {
            cityNode *prev, *cur, *succ;
            cur = prev = top;
            //cur = cur->destCity;
            while (cur != NULL) {
                cityNode *temp = cur->destCity;
                delete cur;
                cur = temp;
            }

            //prev->destCity = NULL;
            while (prev != NULL) {
                cityNode *temp = prev->destCity;
                delete prev;
                prev = temp;
            }

            while (cur != NULL) {
                succ = cur->destCity;
                cur->destCity = prev;
                prev = cur;
                cur = succ;
            }
            top = prev;
        }

        void displayCities() {
            cityNode *stack = top;
            while (stack != NULL) {
                cout << stack->name << " ";
                stack = stack->destCity;
            }
            cout << endl;
        }

        cityNode* getCityNode() {
            return top;
        }
};

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

0xcdcdcdcd используется Visual Studio для маркировки неинициализированной памяти кучи; Вы читаете такую ​​неинициализированную память и, таким образом, получаете этот неверный указатель. Вы должны использовать new, а не malloc в C ++:

void pushCity(cityNode cn) {
  cityNode* newCity = new cityNode(cn.name, cn.totalCost, cn.totalTime);
  newCity->destCity = top;
  top = newCity;
}

new выделит правильный объем памяти и соответствующим образом вызовет ваш конструктор. Между тем, malloc просто выделит немного памяти правильного размера, но ничего не сделает для инициализации объекта. Это приводит к неопределенному поведению .

1 голос
/ 26 апреля 2020

, как уже упоминали другие, вместо этого используйте new, но если вы настаиваете на выделении памяти с помощью mallo c по какой-либо причине (например, избегаете исключения, когда new не может выделить память для какой-либо причины, например, не enouth memory)

вам нужно явно вызвать конструктор путем "замены нового"

   class cityNode* newCity = (class cityNode*) malloc(sizeof(class cityNode));
   if(newCity ==0)
    {throw("can't allocate memory");}
    new(newCity)  cityNode();
    ...
    //you need to call destructor expilictly too
    newCity.~cityNode();
    //you still must use free() not delete
    free(newCity);
1 голос
/ 25 апреля 2020

Не используйте malloc в программе на C ++ (если вы действительно не знаете, что делаете), потому что она не вызывает конструкторы для создаваемых вами объектов.

Замените это

class cityNode* newCity = (class cityNode*) malloc(sizeof(class cityNode));

с этим

cityNode* newCity = new cityNode;
...