gpt4 book ai didi

c++ - boost::multi_array 上的段错误

转载 作者:行者123 更新时间:2023-11-30 04:31:54 25 4
gpt4 key购买 nike

下面的代码给出了一个段错误:

#include <iostream>
#include <fstream>
#include "binItr.h"
#include <boost/multi_array.hpp>

using namespace std;

int main(){
const char * xifile = "results/feretxiG1155V0P5T231K10.bin";

const uint pSize = 5;
const uint T = 231;

ifstream xiFileId(xifile, ios::binary);

typedef boost::multi_array<uint, 2> array_type;
array_type xi(boost::extents[T][pSize + 1]);

//the ii_t class in the following line is taken from http://stackoverflow.com/questions/1855704/c-binary-file-i-o-to-from-containers-other-than-char-using-stl-algorithms written by http://stackoverflow.com/users/14065/loki-astari

ii_t<uint> xi_in(xiFileId);

copy(xi_in, ii_t<uint>(), xi.data());
return 0;
}

输入二进制文件包含 unsigned int 数据,ls -l 报告的大小为 231*(5+1)4 = 5544 字节。我尝试读取文件并将数据存储在 vector 中,发现 vector 大小为 231(5+1) = 1386。使用 gdb 分析核心文件给出以下输出。

    Program terminated with signal 6, Aborted.

#0 0x00007fb71130ea75 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
in ../nptl/sysdeps/unix/sysv/linux/raise.c

(gdb) bt
#0 0x00007fb71130ea75 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x00007fb7113125c0 in abort () at abort.c:92
#2 0x00007fb7113484fb in __libc_message (do_abort=<value optimized out>, fmt=<value optimized out>) at ../sysdeps/unix/sysv/linux/libc_fatal.c:189
#3 0x00007fb7113525b6 in malloc_printerr (action=3, str=0x7fb711425cd8 "double free or corruption (!prev)", ptr=<value optimized out>) at malloc.c:6266
#4 0x00007fb711358e83 in __libc_free (mem=<value optimized out>) at malloc.c:3738
#5 0x00000000004018c4 in __gnu_cxx::new_allocator<unsigned int>::deallocate (this=0x7fffc618d2f8, __p=0x2295290) at /usr/include/c++/4.4/ext/new_allocator.h:95
#6 0x000000000040152f in boost::multi_array<unsigned int, 2ul, std::allocator<unsigned int> >::deallocate_space (this=0x7fffc618d290) at /usr/include/boost/multi_array.hpp:484
#7 0x0000000000401077 in boost::multi_array<unsigned int, 2ul, std::allocator<unsigned int> >::~multi_array (this=0x7fffc618d290, __in_chrg=<value optimized out>) at /usr/include/boost/multi_array.hpp:468
#8 0x0000000000400d4e in main () at segTest.cpp:30

有什么建议吗?谢谢。

最佳答案

问题是 ii_t<>来自 referred SO answer 的输入迭代器类正在“阅读”太多项目,因为包装 istream不返回 EOF直到在返回文件中最后一项的迭代器之后 取消引用。额外返回的数据项正在破坏 multi_array 中分配的内存块。对象。

如果您更改 ii_t<>类如下,你应该得到更好的行为:

template<typename T>
struct ii_t: public iterator<input_iterator_tag, void, void, void, void>
{
ii_t(std::istream& str)
:m_str(&str)
{}
ii_t()
:m_str(NULL)
{}
ii_t& operator++() {return *this;} // increment does nothing.
ii_t& operator++(int){return *this;}
T& operator*()
{
// On the de-reference we actuall read the data into a local //// static ////
// Thus we can return a reference
static T result;
m_str->read(reinterpret_cast<char*>(&result),sizeof(T));
return result;
}
// If either iterator has a NULL pointer then it is the end() of stream iterator.
// Input iterators are only equal if they have read past the end of stream.
bool operator!=(ii_t const& rhs)
{
// we need to make sure we're not just about to hit EOF
// if we already haven't
if (m_str && m_str->good()) {
char dummy;
m_str->read(&dummy,1);
if (m_str->good()) {
m_str->putback(dummy);
}
}

if (rhs.m_str && rhs.m_str->good()) {
char dummy;
rhs.m_str->read(&dummy,1);
if (rhs.m_str->good()) {
rhs.m_str->putback(dummy);
}
}

bool lhsPastEnd = (m_str == NULL) || (!m_str->good());
bool rhsPastEnd = (rhs.m_str == NULL) || (!rhs.m_str->good());

return !(lhsPastEnd && rhsPastEnd);
}

private:
std::istream* m_str;
};

相关变化在bool operator!=(ii_t const& rhs)中函数,如有必要,在包装的 istream 上执行(然后撤消)虚拟读取确定 istream 是否在 EOF。

请注意,我并没有声称这是处理 EOF 的最佳技术。情况,但它似乎有效。

关于c++ - boost::multi_array 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8004456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com