SIGBUS при уничтожении объекта с помощью std :: fstream объектов

0

Я переносил проект в Solaris из режима совместимости (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() и размером буфера и думал, что это основная проблема, но проблема, похоже, всплыла.

Имеет ли кто-нибудь другой опыт работы с мигрирующим кодом C++ от compat до std 64 и может дать какое-либо представление о том, как исправить SIGBUS вокруг потоков?

Теги:
64bit
stl
solaris
sparc

1 ответ

1

В случае, если кому-то интересно, кажется, что потоки Standard C++ на Solaris (RWTools 7), деструктор для fstream и т.д. Удаляют буфер, который вы устанавливаете с помощью pubsetbuf.

Это означает, что нужно делать такие вещи, как:

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

не хорошо. Он фактически удалит вашу память, объявленную в стеке. Я протестировал простое приложение, в котором есть буфера char * и задает буфер с помощью setbuf/pubsetbuf для режима совместимости (4) и версии (5) со стандартной библиотекой IO Streams.

В режиме совместимости есть утечки памяти, так как char * не удаляется. В случае стандартной библиотеки io-потока утечки памяти отсутствуют.

Аналогично, если вы удалите указатель, вы получите duf с проверкой доступа dbx и baf, если у вас есть массив символов, объявленный в стеке.

Довольно много значит, у меня есть много кода для изменения :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню