gpt4 book ai didi

c++ - 使类可迭代:访问冲突读取位置

转载 作者:行者123 更新时间:2023-12-02 09:55:31 25 4
gpt4 key购买 nike

我创建了一个名为ring的类,它的工作原理如下:

ring<std::string> example(2);
examples.add("one");
examples.add("two");
examples.add("three"); // this element will replace the first element

另外,我尝试使其变得可迭代,但是由于访问冲突读取位置异常而崩溃
异常位置在主for循环中的cout处
该程序运行良好,没有for循环

铃声类:
template <class input>
class ring {
public:
class iterator;

private:
input* data;
int size;
int pos = 0;

public:
ring(const int size) : size(size), data(NULL) { data = new input[size]; }

~ring() { delete[] data; }

void add(input in) {
if (pos == size)
pos = 0;
data[pos++] = in;
}

iterator begin() { return iterator(0, *this); }

iterator end() { return iterator(size - 1, *this); }

input& get(int i) { return data[i]; }
};

迭代器类:
template <class input>
class ring<input>::iterator {
private:
int m_pos;
ring m_ring;

public:
iterator(int pos, ring& aRing) : m_pos(pos), m_ring(aRing) {}

~iterator() {}

input& operator* () { return m_ring.get(m_pos); }

bool operator!= (const iterator& other) const { return m_pos != other.m_pos; }

iterator& operator++(int) {
m_pos++;
return *this;
}

iterator& operator++() {
m_pos++;
return *this;
}
};

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

textring.add("one");
textring.add("two");
textring.add("three");
textring.add("four");

for (auto text : textring) {
cout << text << endl;
}
}

最佳答案

您的程序崩溃,因为类ring没有实现rule of three。您应该提供所有复制操作。

撞车的原因是什么?

在析构函数中,相同的内存由于浅拷贝而被删除了两次。此副本由begin / end生成,它返回在其中复制ring的迭代器。

快速解决方案是将ring存储在迭代器中作为引用:

template <class input>
class ring<input>::iterator {
private:
int m_pos;
ring& m_ring;

Demo

关于c++ - 使类可迭代:访问冲突读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60469146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com