用const_iterator成员调用类destructor时堆积损坏
Heap corruption when calling destructor of class with const_iterator member
我有一个带有字符串deque的班级和一个迭代器作为成员。有一个GetNext()
方法,它为我提供了下一个元素并递增迭代器。使用外部的课程,我检查一个空字符串以指示Deque的末端。不幸的是,当调用构造函数并使用getNext获得最后一个元素时,我会造成巨大的损坏。我想这是因为在Deque中的最后一个字符串(空字符串)之后,迭代器仍会递增,并且在内存中点?因此,破坏者然后尝试释放此内存,然后崩溃?
#include <iostream>
#include <string>
#include <deque>
class Foo
{
public:
Foo()
{
list.push_back("first elm");
list.push_back("second elm");
list.push_back(std::string());
pNextItem = list.begin();
}
virtual ~Foo(){}
const std::string& GetNext() { return *pNextItem++; }
protected:
std::deque<std::string> list;
std::deque<std::string>::const_iterator pNextItem;
};
int main()
{
{
Foo foo;
std::cout << foo.GetNext() << std::endl; // "first elm"
std::cout << foo.GetNext() << std::endl; // "second elm"
std::cout << foo.GetNext() << std::endl; // ""
//third call sets the iterator past the last element and causes a segfault
std::cout << foo.GetNext() << std::endl;
}
}
这是一个例子:可编译和可执行的示例
您需要检查pNextItem
是否等于list.cend()
。这正是foo.GetNext()
的第三个调用后发生的情况,当您将取消最后一个元素并增加迭代器时。
来自deque::end
参考:
将迭代器返回到元素之后的元素 容器。
这个元素是占位符;尝试访问它的结果 未定义的行为。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 损坏的结构字符数组 - sqlite C++
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- zlib 膨胀在使用小缓冲区时会损坏
- 用const_iterator成员调用类destructor时堆积损坏