0

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

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

---- 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 

我在使用 setbuf() 和缓冲区大小的 std 流中遇到了一些时髦的问题,并认为这是主要问题,但问题似乎又出现了。

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

4

1 回答 1

1

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

这意味着做类似的事情:

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

不好。它实际上会删除您在堆栈上声明的内存。我已经测试了一个简单的应用程序,它使用标准 IO Streams 库为兼容模式 (4) 和版本 (5) 设置了一个 char* 缓冲区并使用 setbuf/pubsetbuf 设置缓冲区。

在兼容模式下,存在内存泄漏,因为 char* 未被删除。在标准 io 流库的情况下,没有内存泄漏。

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

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

于 2013-10-09T10:51:13.813 回答