Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使类Iterable.exe:0xC0000005:访问冲突读取位置0xDDDD时,在0x7933F3BE(基于UCRTBASE.dll)处引发异常。发生_C++_Visual Studio_Exception_Operator Overloading - Fatal编程技术网

C++ 使类Iterable.exe:0xC0000005:访问冲突读取位置0xDDDD时,在0x7933F3BE(基于UCRTBASE.dll)处引发异常。发生

C++ 使类Iterable.exe:0xC0000005:访问冲突读取位置0xDDDD时,在0x7933F3BE(基于UCRTBASE.dll)处引发异常。发生,c++,visual-studio,exception,operator-overloading,C++,Visual Studio,Exception,Operator Overloading,引发异常,访问冲突读取位置。 我已经完全重载了所有操作符,但不知道发生这种情况的原因。 该循环在教程中运行良好,但在我的系统上没有运行。 请帮帮我,这是密码- 这是由me-ring.h定义的 #pragma once #ifndef RING_H_ #define RING_H_ #include<iostream> using namespace std; template<class T> class ring { private: int m_pos;

引发异常,访问冲突读取位置。 我已经完全重载了所有操作符,但不知道发生这种情况的原因。 该循环在教程中运行良好,但在我的系统上没有运行。 请帮帮我,这是密码-

这是由me-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_
#pragma一次
#ifndef环_
#定义环_
#包括
使用名称空间std;
模板
阶级戒指
{
私人:
国际货币基金组织;
T*m_值;
国际货币单位大小;
公众:
类迭代器;
公众:
环(整数大小):m_位置(0)、m_大小(大小)、m_值(空)
{
m_值=新的T[尺寸];
}
~ring()
{
删除[]个m_值;
}
int size()
{
返回m_大小;
}
迭代器begin()
{
返回迭代器(0,*this);
}
迭代器结束()
{
返回迭代器(m_size-1,*this);
}
无效添加(T值)
{
m_值[m_pos++]=值;
如果(m_pos==m_大小)
{
m_pos=0;
}
}
T&get(内部位置)
{
返回m_值[pos];
}
};
模板
类环::迭代器
{
私人:
国际货币基金组织;
环m_环;
公众:
迭代器(int-pos,ring&aRing):m_-ring(aRing),m_-pos(pos){}
迭代器和运算符++(int)
{
m_pos++;
归还*这个;
}
T&运算符*()
{
返回m_环。获取(m_位置);
}
布尔运算符!=(常量迭代器和其他)常量
{
返回m_pos!=其他m_pos;
}
};
#endif//环_
下面是包含主函数的文件-(source.cpp)

#包括
#包括“ring.h”
使用名称空间std;
int main()
{
手机铃声(3);
textring.add(“一”);
textring.add(“两个”);
textring.add(“三”);
for(ring::iterator it=textring.begin();it!=textring.end();it++)
{

cout值
0xdddddddd
是传递给
free
(或
delete
)的内存模式。换句话说,您正在使用堆上分配的内存,但不再是

问题是您的
迭代器
类复制
对象,但
类不跟随

一个简单的解决方案(可能是最好的)是根本不复制,而是在
迭代器
类中存储对
对象的引用:

template<class T>
class ring<T>::iterator
{
private:
    int m_pos;
    ring& m_ring;  // Reference to a "ring"
    ...
};
模板
类环::迭代器
{
私人:
国际货币基金组织;
ring&m_ring;//对“环”的引用
...
};

为了进一步验证
类,我建议您花一些时间学习


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

正如@Someprogrmmerdude给出的答案所指出的那样,您不需要所有代码来显示您的类存在严重缺陷。
int main(){ring testString(3);ring s2=testString;ring s3(2);s3=s2;}
。那个简单的程序有内存泄漏和双重删除错误。你不能为这样一个根本性的坏类实现迭代器,至少要有信心。@PaulMcKenzie我刚从我的导师那里复制了它,它和导师一起工作很好,但非常感谢你指出它,谢谢你,伙计
template<class T>
class ring<T>::iterator
{
private:
    int m_pos;
    ring& m_ring;  // Reference to a "ring"
    ...
};