Исключение в 0x7933F3BE (ucrtbased.dll) при создании классов Iterable.exe: 0xC0000005: место чтения нарушения прав доступа 0xDD DDDDDD. произошло - PullRequest
0 голосов
/ 01 августа 2020

Выдается исключение, место чтения нарушения прав доступа. Я отлично перегрузил все операторы и не знаю, почему это происходит. L oop отлично работал в учебнике, но он не работает в моей системе. Пожалуйста, помогите мне, вот код -

Это определено мной - ring.h

#pragma once
#ifndef RING_H_
#define RING_H_

#include<iostream>
using namespace std;

template<class T>
class ring
{
private:
    int m_pos;
    T* m_values;
    int m_size;
public:
    class iterator;
public:
    ring(int size) : m_pos(0), m_size(size), m_values(NULL)
    {
        m_values = new T[size];
    }
    ~ring()
    {
        delete[] m_values;
    }
    int size()
    {
        return m_size;
    }
    iterator begin()
    {
        return iterator(0, *this);
    }
    iterator end()
    {
        return iterator(m_size-1, *this);
    }
    void add(T value)
    {
        m_values[m_pos++] = value;

        if (m_pos == m_size)
        {
            m_pos = 0;
        }
    }
    T& get(int pos)
    {
        return m_values[pos];
    }
};
template<class T>
class ring<T>::iterator
{
private:
    int m_pos;
    ring m_ring;
public:
    iterator(int pos, ring &aRing): m_ring(aRing), m_pos(pos) {}
    iterator& operator++(int)
    {
        m_pos++;

        return *this;
    }
    T& operator*()
    {
        return m_ring.get(m_pos);
    }
    bool operator!=(const iterator& other) const
    {
        return m_pos != other.m_pos;
    }
};

#endif //RING_H_

А вот файл, содержащий основную функцию - (source. cpp)

#include<iostream>
#include"ring.h"

using namespace std;

int main()
{
    ring<string> textring(3);

    textring.add("One");
    textring.add("Two");
    textring.add("Three");

    for (ring<string>::iterator it = textring.begin(); it != textring.end(); it++)
    {
        cout << *it << endl;
    }
    cout << endl;
    /*for (string value : textring)
    {
        cout << value << endl;
    }*/
}

1 Ответ

1 голос
/ 01 августа 2020

Значение 0xdddddddd - это хорошо известный образец памяти , который был передан в free (или delete). Другими словами, где-то вы используете память, которая была выделена в куче, но больше не выделяется.

Проблема в том, что ваш iterator класс копирует объект ring, но класс ring не следует правилам трех, пяти или нуля .

Простое решение (и, вероятно, лучшее) - не копировать в все, кроме ссылки на объект ring в классе iterator:

template<class T>
class ring<T>::iterator
{
private:
    int m_pos;
    ring& m_ring;  // Reference to a "ring"
    ...
};

Для будущего класса ring я рекомендую вам потратить некоторое время на изучение правил трех, пяти или нуля .

Я действительно рекомендую использовать std::vector и следуйте правилу нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...