用const_iterator成员调用类destructor时堆积损坏

Heap corruption when calling destructor of class with const_iterator member

本文关键字:destructor 损坏 调用 const iterator 成员      更新时间:2023-10-16

我有一个带有字符串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参考:

将迭代器返回到元素之后的元素 容器。

这个元素是占位符;尝试访问它的结果 未定义的行为。