C++ 使类Iterable.exe:0xC0000005:访问冲突读取位置0xDDDD时,在0x7933F3BE(基于UCRTBASE.dll)处引发异常。发生
引发异常,访问冲突读取位置。 我已经完全重载了所有操作符,但不知道发生这种情况的原因。 该循环在教程中运行良好,但在我的系统上没有运行。 请帮帮我,这是密码- 这是由me-ring.h定义的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;
#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"
...
};