使用C ++ Stream API发生访问冲突异常

时间:2018-11-17 12:58:52

标签: c++ visual-studio visual-c++

为简化我的容器操作,我想找到一个具有与著名Java 8 Stream API相同功能的API,但使用C ++。经过一些研究,我发现可以在以下链接中找到Jonah Scheinerman的C ++流库:

https://bitbucket.org/jscheiny/streams

我尝试使用Visual Studio Community 2017执行以下代码以测试API:

#include <Stream.h>

int main() {

    MakeStream::from({ 1, 2, 3, 4, 5 })
        .for_each([](int value) {
        std::cout << value << std::endl;
    });
    return (EXIT_SUCCESS);
}

直到这里,都没有问题。该代码可以正确显示数字。

但是当我在变量中初始化向量时:

#include <Stream.h>

int main() {

    std::vector<int> x = { 1, 2, 3, 4, 5 };
    MakeStream::from(x)
        .for_each([](int value) {
        std::cout << value << std::endl;
    });
    return (EXIT_SUCCESS);
}

我在xutility标头文件中的0xDDDDDDDD处有一个访问冲突写入位置。

enter image description here

向量被销毁时似乎会出现问题。

我真的迷路了。有人能告诉我会发生什么吗?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这里的问题似乎是库使用扭曲的类层次结构(包括花哨的东西,例如模板类,实际上继承了其同类的不同专业),但是所有类都没有虚拟析构函数,因此对象销毁无法正确执行,VS调试迭代器会绑架期间触发错误。特别是,StreamImpl<int, Common>基类将具有一个::std::unique_ptr<StreamProvider<int>>字段,该字段将用于存储IteratorStreamProvider<int, ::std::vector<int>::const_iterator>类的实例。

StreamImplStreamProvider开始在各处添加虚拟析构函数可以解决此问题。

我还要说,使用该库将使您的方向与“简化我的容器操作”相反。