为了简化我的容器操作,我想找到一个具有与著名的 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 处有一个访问冲突写入位置。
这个问题似乎是在 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/