【问题标题】:Exception thrown at 0x7933F3BE (ucrtbased.dll) in Making Classes Iterable.exe: 0xC0000005: Access violation reading location 0xDDDDDDDD. occurred在 Make Classes Iterable.exe 中的 0x7933F3BE (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0xDDDDDDDD。发生了
【发布时间】:2020-08-01 06:13:26
【问题描述】:

抛出异常,访问冲突读取位置。 我已经完美地重载了所有运算符,并且不知道发生这种情况的原因。 该循环在本教程中运行良好,但它没有在我的系统上运行。 请帮帮我,这是代码-

这是我定义的 - 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;
    }*/
}

【问题讨论】:

  • 正如@Someprogrmmerdude 给出的答案所指出的那样,您不需要所有代码来显示您的课程存在严重缺陷。 int main() { ring&lt;string&gt; testString(3); ring&lt;string&gt; s2 = testString; ring&lt;string&gt; s3(2) ; s3 = s2;}。那个简单的程序有内存泄漏和双重删除错误。你不能为这样一个从根本上被破坏的类实现迭代器,至少有信心。
  • @PaulMcKenzie 我刚刚从我的教程人那里复制了它,它与导师工作得很好,但非常感谢您指出,谢谢人

标签: c++ visual-studio exception operator-overloading


【解决方案1】:

0xdddddddd 是一个well-known 内存模式,已传递给free(或delete)。换句话说,您正在使用的内存在堆上分配,但现在不再分配。

问题是您的iterator复制 ring 对象,但ring 类不遵循the rules of three, five or zero

一个简单的解决方案(可能是最好的)是根本不复制,而是将 reference 存储到 iterator 类中的 ring 对象:

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

为了让ring 课程面向未来,我建议您花一些时间学习一下the rules of three, five or zero

我真的建议使用std::vector 并遵循零规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2020-02-13
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多