使用std :: fstream对象破坏对象时的SIGBUS

时间:2013-10-09 04:18:30

标签: c++ stl 64-bit solaris sparc

我一直在将Solaris上的项目从compat模式(4)迁移到64位,使用STL和标准流库。

在大多数情况下,我设法克服了很多问题。然而,我遇到了一些关于流和破坏的问题。

---- called from signal handler with signal 10 (SIGBUS) ------
[7] realfree(0x108be78e8, 0x5554d45f54d7d4d7, 0x1da530, 0x5554d45f54d7d4d4, 0xffffffff7ae3e000, 0x108be78d8), at 0xffffffff7ac63b2c
[8] cleanfree(0x0, 0x1d9bc4, 0xffffffff7ae4ead8, 0xffffffff7accfcec, 0xffffffff7ae3e000, 0xffffffff7ae4ebd8), at 0xffffffff7ac64498
[9] _malloc_unlocked(0x20, 0x0, 0x0, 0xffffffff7ae3e000, 0x0, 0x0), at 0xffffffff7ac634f4
[10] malloc(0x20, 0x23e0, 0x1dac88, 0xffffffff7ac633d8, 0xffffffff7ae3e000, 0x2000), at 0xffffffff7ac633c8
[11] operator new(0x20, 0x0, 0x1, 0x1068d4, 0x105584e70, 0xffffffff7b20f028), at 0xffffffff7b108770
[12] std::basic_filebuf<char,std::char_traits<char> >::close(0x108bf7a60, 0x108bfbd30, 0xffffffffffffffff, 0xffffffff7ae4c060, 0xffffffffffffffe0, 0x108bf7a60), at 0xffffffff7b37657c
[13] std::basic_filebuf<char,std::char_traits<char> >::~basic_filebuf(0x108bf7a60, 0x108bfbe38, 0x0, 0x0, 0x0, 0x0), at 0xffffffff7b3764c4
[14] std::basic_ifstream<char,std::char_traits<char> >::~basic_ifstream(0x108bf7a48, 0x1c8, 0x24, 0x1021a66d0, 0x1af984, 0x0), at 0xffffffff7b3f30d4 

我遇到了一些关于std流的问题和setbuf()以及缓冲区大小的问题,并认为这是主要问题,但问题似乎重新出现了。

是否还有其他人在将comp ++中的C ++代码迁移到std 64方面有类似的经验,并且可以提供有关如何修复SIGBUS流的任何见解?

1 个答案:

答案 0 :(得分:1)

如果有人想知道,看来Solaris上的标准C ++流(RWTools 7),fstream等的析构函数将删除你用pubsetbuf设置的缓冲区。

这意味着做一些事情:

char buf[1024];
ofstream out;
out.rdbuf()->pubsetbuf(buf, 1024);

不好。它实际上会删除在堆栈上声明的内存。 我测试了一个简单的应用程序,该应用程序使用标准IO Streams库,使用setbuf / pubsetbuf为compat mode(4)和version(5)设置缓冲区并设置缓冲区。

在compat模式下,存在内存泄漏,因为char *未被删除。对于标准的io流库,没有内存泄漏。

同样,如果你删除了指针,你将得到一个带有dbx访问检查的duf和baf,如果你在堆栈上声明了一个char数组。

几乎意味着,我有很多代码要改变:(