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

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

为了简化我的容器操作,我想找到一个具有与著名的 Java 8 Stream API 相同的特性但使用 C++ 的 API。经过一些研究,我在以下链接中找到了 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);
}

到这里,没有问题。代码正确显示数字。

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

#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

这个问题似乎是在 vector 被销毁时出现的。

我真的迷路了。谁能告诉我发生了什么?

非常感谢您的帮助。

最佳答案

这里的问题似乎是库使用了扭曲的类层次结构(包括像模板类这样的花哨的东西实际上继承了它自己种类的不同特化)但是所有的类都缺少虚拟析构函数所以对象销毁没有正确执行并且 VS 调试迭代器将在清理期间触发错误。特别是,StreamImpl<int, Common>基类将有一个 ::std::unique_ptr<StreamProvider<int>>将用于存储 IteratorStreamProvider<int, ::std::vector<int>::const_iterator> 实例的字段类。

StreamImpl开始到处添加虚拟析构函数和 StreamProvider使这个问题消失。

另外我想说的是,使用这个库将带您走向与“简化我的容器操作”相反的方向。

关于c++ - 使用 C++ Stream API 发生访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53351473/

相关文章:

c++ - 大气光散射实现

visual-studio - Visual Studio : missing Shortcut: "Visual Studio Command Prompt"

具有多种功能的 C++ SSE 优化

c# - 在 C# 中清理/刷新托盘区域

c++ - Winsock 的 connect() 函数超时

c++ - 如何检查C中是否存在文件:\drive using VC++?

c++ - Visual C++ 做深拷贝的好方法?

c++ - 为什么 C++17 中的全局内联变量和静态内联成员需要守卫?

c++ - Getline 从文本文件中读取

c++ - 头文件导入行为异常