Hi, I was just wondering if I'm doing something wrong in this little program compiled with stdcxx 4.2.1, Sun Studio C++ 12, Solaris 10u5 AMD64, compiled as 64 bit:
#include <locale> #include <string> int main() { std::locale loc = std::locale("fr_FR"); std::string s1("Et la marine va venir à Malte"); std::string s2("Et la marine va venir à Malte"); const std::collate<std::string::value_type>& col = std::use_facet<std::collate<std::string::value_type> >(loc); if (col.compare(s1.c_str(), s1.c_str() + s1.length(), s2.c_str(), s2.c_str() + s2.length()) == 0) return 1; return 0; } Running it encounters a sigsegv, when it calls delete [] pbuf on non heap memory: goanna% export LD_FLAGS_64="preload=libumem.so.1" goanna% export UMEM_DEBUG=default goanna% ./collate zsh: segmentation fault (core dumped) ./collate goanna% unset LD_FLAGS_64 goanna% unset UMEM_DEBUG goanna% dbx collate core Reading collate core file header read successfully Reading ld.so.1 Reading libumem.so.1 Reading libstd15D.so.4.2.1 Reading libCrun.so.1 Reading libm.so.2 Reading libthread.so.1 Reading libc.so.1 Reading fr_FR.ISO8859-1.so.3 [EMAIL PROTECTED] ([EMAIL PROTECTED]) program terminated by signal SEGV (no mapping at the fault address) 0xfffffd7fefd6374f: process_free+0x002f: movl (%rsi),%r8d Current function is __rw::__rw_strnxfrm 577 delete[] pbuf; (dbx) where current thread: [EMAIL PROTECTED] [1] process_free(0xffdfb5b7, 0xffdfb5af, 0x0, 0xfffffd7fffdfb42f, 0xfffffd7fffdfb5b7, 0xffdfb5b7), at 0xfffffd7fefd6374f [2] free(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7fefd638f5 [3] operator delete(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7fefbc9621 [4] operator delete[](0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7fefbc9549 =>[5] __rw::__rw_strnxfrm(src = 0x450f45 "", nchars = 0), line 577 in "collate.cpp" [6] std::collate_byname<char>::do_transform(this = 0x451f20, low = 0x450f28 "Et la marine va venir à Malte", high = 0x450f45 ""), line 925 in "collate.cpp" [7] std::collate_byname<char>::do_compare(this = 0x451f20, low1 = 0x450f28 "Et la marine va venir à Malte", high1 = 0x450f45 "", low2 = 0x450e28 "Et la marine va venir à Malte", high2 = 0x450e45 ""), line 895 in "collate.cpp" [8] std::collate<char>::compare(this = 0x451f20, __low1 = 0x450f28 "Et la marine va venir à Malte", __high1 = 0x450f45 "", __low2 = 0x450e28 "Et la marine va venir à Malte", __high2 = 0x450e45 ""), line 119 in "_collate.h" [9] main(), line 10 in "collate.cpp" (dbx) print pbuf pbuf = 0xffdfb5b7 "<bad address 0xffdfb5b7>" (dbx) loadobject -list m /h/goanna/2/eng/dev/cxx/collate/collate (primary) m /lib/amd64/libumem.so.1 m /h/goanna/1/a_5.10_m64/c/lib/libstd15D.so.4.2.1 m /usr/lib/amd64/libCrun.so.1 m /lib/amd64/libm.so.2 m /lib/amd64/libthread.so.1 m /lib/amd64/libc.so.1 m /usr/lib/locale/fr_FR.ISO8859-1/amd64/fr_FR.ISO8859-1.so.3 (dbx) Thanks very much, Mark --