
   #[1]GNU C++ Standard Library [2]Copyright

                     libstdc++ Frequently Asked Questions

   The latest version of this document is always available at
   [3]http://gcc.gnu.org/onlinedocs/libstdc++/faq/. The main
   documentation page is at
   [4]http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html. 

   To the [5]libstdc++-v3 homepage. 
     _________________________________________________________________

                                   Questions

    1. [6]General Information
         1. [7]What is libstdc++-v3?
         2. [8]Why should I use libstdc++?
         3. [9]Who's in charge of it?
         4. [10]How do I get libstdc++?
         5. [11]When is libstdc++ going to be finished?
         6. [12]How do I contribute to the effort?
         7. [13]What happened to libg++? I need that!
         8. [14]What if I have more questions?
         9. [15]What are the license terms for libstdc++-v3?
    2. [16]Installation
         1. [17]How do I install libstdc++-v3?
         2. [18][removed]
         3. [19]What is this CVS thing that you keep mentioning?
         4. [20]How do I know if it works?
         5. [21]This library is HUGE! And what's libsupc++?
         6. [22]Why do I get an error saying libstdc++.so.X is missing
            when I run my program?
    3. [23]Platform-Specific Issues
         1. [24]Can libstdc++-v3 be used with <my favorite compiler>?
         2. [25][removed]
         3. [26][removed]
         4. [27]I can't use 'long long' on Solaris
         5. [28]_XOPEN_SOURCE / _GNU_SOURCE / etc is always defined
         6. [29]OS X ctype.h is broken! How can I hack it?
         7. [30]Threading is broken on i386
         8. [31]Recent GNU/Linux glibc required?
         9. [32]Can't use wchar_t/wstring on FreeBSD
        10. [33]MIPS atomic operations
    4. [34]Known Bugs and Non-Bugs
         1. [35]What works already?
         2. [36]Bugs in gcc/g++ (not libstdc++-v3)
         3. [37]Bugs in the C++ language/lib specification
         4. [38]Things in libstdc++ that only look like bugs
               o [39]reopening a stream fails
               o [40]-Weffc++ complains too much
               o [41]"ambiguous overloads" after including an old-style
                 header
               o [42]The g++-3 headers are not ours
               o [43]compilation errors from streambuf.h
               o [44]errors about *Concept and constraints in the STL...
               o [45]program crashes when using library code in a
                 dynamically-loaded library
               o [46]"memory leaks" in containers
         5. [47]Aw, that's easy to fix!
    5. [48]Miscellaneous
         1. [49]string::iterator is not char*; vector<T>::iterator is not
            T*
         2. [50]What's next after libstdc++-v3?
         3. [51]What about the STL from SGI?
         4. [52]Extensions and Backward Compatibility
         5. [53][removed]
         6. [54]Is libstdc++-v3 thread-safe?
         7. [55]How do I get a copy of the ISO C++ Standard?
         8. [56]What's an ABI and why is it so messy?
         9. [57]How do I make std::vector<T>::capacity() ==
            std::vector<T>::size?
     _________________________________________________________________

                            1.0 General Information

1.1 What is libstdc++-v3?

   The GNU Standard C++ Library v3 is an ongoing project to implement the
   ISO 14882 Standard C++ library as described in chapters 17 through 27
   and annex D. For those who want to see exactly how far the project has
   come, or just want the latest bleeding-edge code, the up-to-date
   source is available over anonymous CVS, and can even be browsed over
   the Web (see [58]1.4 below).

   The older libstdc++-v2 project is no longer maintained; the code has
   been completely replaced and rewritten. [59]If you are using V2, then
   you need to report bugs to your system vendor, not to the V3 list.

   A more formal description of the V3 goals can be found in the official
   [60]design document.
     _________________________________________________________________

1.2 Why should I use libstdc++?

   The completion of the ISO C++ standardization gave the C++ community a
   powerful set of reuseable tools in the form of the C++ Standard
   Library. However, all existing C++ implementations are (as the Draft
   Standard used to say) "incomplet and incorrekt," and many suffer from
   limitations of the compilers that use them.

   The GNU C/C++/FORTRAN/<pick-a-language> compiler (gcc, g++, etc) is
   widely considered to be one of the leading compilers in the world. Its
   development is overseen by the [61]GCC team. All of the rapid
   development and near-legendary [62]portability that are the hallmarks
   of an open-source project are being applied to libstdc++.

   That means that all of the Standard classes and functions (such as
   string, vector<>, iostreams, and algorithms) will be freely available
   and fully compliant. Programmers will no longer need to "roll their
   own" nor be worried about platform-specific incompatibilities.
     _________________________________________________________________

1.3 Who's in charge of it?

   The libstdc++ project is contributed to by several developers all over
   the world, in the same way as GCC or Linux. Benjamin Kosnik, Gabriel
   Dos Reis, Phil Edwards, Ulrich Drepper, Loren James Rittle, and Paolo
   Carlini are the lead maintainers of the CVS archive.

   Development and discussion is held on the libstdc++ mailing list.
   Subscribing to the list, or searching the list archives, is open to
   everyone. You can read instructions for doing so on the [63]homepage.
   If you have questions, ideas, code, or are just curious, sign up!
     _________________________________________________________________

1.4 How do I get libstdc++?

   The [64]homepage has instructions for retrieving the latest CVS
   sources, and for browsing the CVS sources over the web.

   Stable versions of libstdc++-v3 are included with releases of [65]the
   GCC compilers.

   The subset commonly known as the Standard Template Library (chapters
   23 through 25, mostly) is adapted from the final release of the SGI
   STL, with extensive changes.
     _________________________________________________________________

1.5 When is libstdc++ going to be finished?

   Nathan Myers gave the best of all possible answers, responding to a
   Usenet article asking this question: Sooner, if you help.
     _________________________________________________________________

1.6 How do I contribute to the effort?

   Here is [66]a page devoted to this topic. Subscribing to the mailing
   list (see above, or the homepage) is a very good idea if you have
   something to contribute, or if you have spare time and want to help.
   Contributions don't have to be in the form of source code; anybody who
   is willing to help write documentation, for example, or has found a
   bug in code that we all thought was working, is more than welcome!
     _________________________________________________________________

1.7 What happened to libg++? I need that!

   The most recent libg++ README states that libg++ is no longer being
   actively maintained. It should not be used for new projects, and is
   only being kicked along to support older code.

   The libg++ was designed and created when there was no Standard to
   provide guidance. Classes like linked lists are now provided for by
   list<T> and do not need to be created by genclass. (For that matter,
   templates exist now and are well-supported, whereas genclass (mostly)
   predates them.)

   There are other classes in libg++ that are not specified in the ISO
   Standard (e.g., statistical analysis). While there are a lot of really
   useful things that are used by a lot of people (e.g., statistics :-),
   the Standards Committee couldn't include everything, and so a lot of
   those "obvious" classes didn't get included.

   Since libstdc++ is an implementation of the Standard Library, we have
   no plans at this time to include non-Standard utilities in the
   implementation, however handy they are. (The extensions provided in
   the SGI STL aren't maintained by us and don't get a lot of our
   attention, because they don't require a lot of our time.) It is
   entirely plausable that the "useful stuff" from libg++ might be
   extracted into an updated utilities library, but nobody has started
   such a project yet.

   (The [67]Boost site houses free C++ libraries that do varying things,
   and happened to be started by members of the Standards Committee.
   Certain "useful stuff" classes will probably migrate there.)

   For the bold and/or desperate, the [68]GCC extensions page describes
   where to find the last libg++ source.
     _________________________________________________________________

1.8 What if I have more questions?

   If you have read the README and RELEASE-NOTES files, and your question
   remains unanswered, then just ask the mailing list. At present, you do
   not need to be subscribed to the list to send a message to it. More
   information is available on the homepage (including how to browse the
   list archives); to send to the list, use [69]libstdc++@gcc.gnu.org.

   If you have a question that you think should be included here, or if
   you have a question about a question/answer here, contact [70]Phil
   Edwards or [71]Gabriel Dos Reis.
     _________________________________________________________________

1.9 What are the license terms for libstdc++-v3?

   See [72]our license description for these and related questions.
     _________________________________________________________________

                               2.0 Installation

2.1 How do I install libstdc++-v3?

   Complete instructions are not given here (this is a FAQ, not an
   installation document), but the tools required are few:
     * A 3.x release of GCC. Note that building GCC is much easier and
       more automated than building the GCC 2.[78] series was. If you are
       using GCC 2.95, you can still build earlier snapshots of
       libstdc++.
     * GNU Make is required for GCC 3.4 and later.
     * The GNU Autotools are needed if you are messing with the configury
       or makefiles.

   The file [73]documentation.html provides a good overview of the steps
   necessary to build, install, and use the library. Instructions for
   configuring the library with new flags such as --enable-threads are
   there also, as well as patches and instructions for working with GCC
   2.95.

   The top-level install.html and [74]RELEASE-NOTES files contain the
   exact build and installation instructions. You may wish to browse
   those files over CVSweb ahead of time to get a feel for what's
   required. RELEASE-NOTES is located in the ".../docs/17_intro/"
   directory of the distribution.
     _________________________________________________________________

2.2 [removed]

   This question has become moot and has been removed. The stub is here
   to preserve numbering (and hence links/bookmarks).
     _________________________________________________________________

2.3 What is this CVS thing that you keep mentioning?

   The Concurrent Versions System is one of several revision control
   packages. It was selected for GNU projects because it's free (speech),
   free (beer), and very high quality. The [75]CVS entry in the GNU
   software catalogue has a better description as well as a [76]link to
   the makers of CVS.

   The "anonymous client checkout" feature of CVS is similar to anonymous
   FTP in that it allows anyone to retrieve the latest libstdc++ sources.

   After the first of April, American users will have a "/pharmacy"
   command-line option...
     _________________________________________________________________

2.4 How do I know if it works?

   libstdc++-v3 comes with its own testsuite. You do not need to actually
   install the library ("make install") to run the testsuite, but you do
   need DejaGNU, as described [77]here.

   To run the testsuite on the library after building it, use "make
   check" while in your build directory. To run the testsuite on the
   library after building and installing it, use "make check-install"
   instead.

   If you find bugs in the testsuite programs themselves, or if you think
   of a new test program that should be added to the suite, please write
   up your idea and send it to the list!
     _________________________________________________________________

2.5 This library is HUGE! And what's libsupc++?

   Usually the size of libraries on disk isn't noticeable. When a link
   editor (or simply "linker") pulls things from a static archive
   library, only the necessary object files are copied into your
   executable, not the entire library. Unfortunately, even if you only
   need a single function or variable from an object file, the entire
   object file is extracted. (There's nothing unique to C++ or
   libstdc++-v3 about this; it's just common behavior, given here for
   background reasons.)

   Some of the object files which make up libstdc++.a are rather large.
   If you create a statically-linked executable with -static, those large
   object files are suddenly part of your executable. Historically the
   best way around this was to only place a very few functions (often
   only a single one) in each source/object file; then extracting a
   single function is the same as extracting a single .o file. For
   libstdc++-v3 this is only possible to a certain extent; the object
   files in question contain template classes and template functions,
   pre-instantiated, and splitting those up causes severe maintenance
   headaches.

   It's not a bug, and it's not really a problem. Nevertheless, some
   people don't like it, so here are two pseudo-solutions:

   If the only functions from libstdc++.a which you need are language
   support functions (those listed in [78]clause 18 of the standard,
   e.g., new and delete), then try linking against libsupc++.a (Using gcc
   instead of g++ and explicitly linking in -lsupc++ for the final link
   step will do it). This library contains only those support routines,
   one per object file. But if you are using anything from the rest of
   the library, such as IOStreams or vectors, then you'll still need
   pieces from libstdc++.a.

   The second method is one we hope to incorporate into the library build
   process. Some platforms can place each function and variable into its
   own section in a .o file. The GNU linker can then perform garbage
   collection on unused sections; this reduces the situation to only
   copying needed functions into the executable, as before, but all
   happens automatically.

   Unfortunately the garbage collection in GNU ld is buggy; sections
   (corresponding to functions and variables) which are used are
   mistakenly removed, leading to horrible crashes when your executable
   starts up. For the time being, this feature is not used when building
   the library.
     _________________________________________________________________

2.6 Why do I get an error saying libstdc++.so.X is missing when I run my
program?

   Depending on your platform and library version, the message might be
   similar to one of the following:
    ./a.out: error while loading shared libraries: libstdc++.so.6: cannot open
shared object file: No such file or directory

    /usr/libexec/ld-elf.so.1: Shared object "libstdc++.so.6" not found

   This doesn't mean that the shared library isn't installed, only that
   the dynamic linker can't find it. When a dynamically-linked executable
   is run the linker finds and loads the required shared libraries by
   searching a pre-configured list of directories. If the directory where
   you've installed libstdc++ is not in this list then the libraries
   won't be found. The simplest way to fix this is to use the
   LD_LIBRARY_PATH environment variable, which is a colon-separated list
   of directories in which the linker will search for shared libraries:
    LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH
    export LD_LIBRARY_PATH

   The exact environment variable to use will depend on your platform,
   e.g. DYLD_LIBRARY_PATH for Darwin,
   LD_LIBRARY_PATH_32/LD_LIBRARY_PATH_64 for Solaris 32-/64-bit,
   LD_LIBRARYN32_PATH/LD_LIBRARY64_PATH for Irix N32/64-bit ABIs and
   SHLIB_PATH for HP-UX.

   See the man pages for ld(1), ldd(1) and ldconfig(8) for more
   information. The dynamic linker has different names on different
   platforms but the man page is usually called something such as ld.so /
   rtld / dld.so.
     _________________________________________________________________

                         3.0 Platform-Specific Issues

3.1 Can libstdc++-v3 be used with <my favorite compiler>?

   Probably not. Yet.

   Because GCC advances so rapidly, development and testing of libstdc++
   is being done almost entirely under that compiler. If you are curious
   about whether other, lesser compilers (*grin*) support libstdc++, you
   are more than welcome to try. Configuring and building the library
   (see above) will still require certain tools, however. Also keep in
   mind that building libstdc++ does not imply that your compiler will be
   able to use all of the features found in the C++ Standard Library.

   Since the goal of ISO Standardization is for all C++ implementations
   to be able to share code, the final libstdc++ should, in theory, be
   usable under any ISO-compliant compiler. It will still be targeted and
   optimized for GCC/g++, however.
     _________________________________________________________________

3.2 [removed]

   This question has become moot and has been removed. The stub is here
   to preserve numbering (and hence links/bookmarks).
     _________________________________________________________________

3.3 [removed]

   This question has become moot and has been removed. The stub is here
   to preserve numbering (and hence links/bookmarks).
     _________________________________________________________________

3.4 I can't use 'long long' on Solaris

   By default we try to support the C99 long long type. This requires
   that certain functions from your C library be present.

   Up through release 3.0.2 the tests performed were too general, and
   this feature was disabled when it did not need to be. The most
   commonly reported platform affected was Solaris.

   This has been fixed for 3.0.3 and onwards.
     _________________________________________________________________

3.5 _XOPEN_SOURCE / _GNU_SOURCE / etc is always defined

   On Solaris, g++ (but not gcc) always defines the preprocessor macro
   _XOPEN_SOURCE. On GNU/Linux, the same happens with _GNU_SOURCE. (This
   is not an exhaustive list; other macros and other platforms are also
   affected.)

   These macros are typically used in C library headers, guarding new
   versions of functions from their older versions. The C++ standard
   library includes the C standard library, but it requires the C90
   version, which for backwards-compatability reasons is often not the
   default for many vendors.

   More to the point, the C++ standard requires behavior which is only
   available on certain platforms after certain symbols are defined.
   Usually the issue involves I/O-related typedefs. In order to ensure
   correctness, the compiler simply predefines those symbols.

   Note that it's not enough to #define them only when the library is
   being built (during installation). Since we don't have an 'export'
   keyword, much of the library exists as headers, which means that the
   symbols must also be defined as your programs are parsed and compiled.

   To see which symbols are defined, look for CPLUSPLUS_CPP_SPEC in the
   gcc config headers for your target (and try changing them to see what
   happens when building complicated code). You can also run "g++ -E -dM
   - < /dev/null" to display a list of predefined macros for any
   particular installation.

   This has been discussed on the mailing lists [79]quite a bit.

   This method is something of a wart. We'd like to find a cleaner
   solution, but nobody yet has contributed the time.
     _________________________________________________________________

3.6 OS X ctype.h is broken! How can I hack it?

   This is a long-standing bug in the OS X support. Fortunately, the
   patch is quite simple, and well-known. [80]Here's a link to the
   solution.
     _________________________________________________________________

3.7 Threading is broken on i386

   Support for atomic integer operations is/was broken on i386 platforms.
   The assembly code accidentally used opcodes that are only available on
   the i486 and later. So if you configured GCC to target, for example,
   i386-linux, but actually used the programs on an i686, then you would
   encounter no problems. Only when actually running the code on a i386
   will the problem appear.

   This is fixed in 3.2.2.
     _________________________________________________________________

3.8 Recent GNU/Linux glibc required?

   When running on GNU/Linux, libstdc++ 3.2.1 (shared library version
   5.0.1) and later uses localization and formatting code from the system
   C library (glibc) version 2.2.5. That version of glibc is over a year
   old and contains necessary bugfixes. Many GNU/Linux distros make glibc
   version 2.3.x available now.

   The guideline is simple: the more recent the C++ library, the more
   recent the C library. (This is also documented in the main GCC
   installation instructions.)
     _________________________________________________________________

3.9 Can't use wchar_t/wstring on FreeBSD

   At the moment there are a few problems in FreeBSD's support for wide
   character functions, and as a result the libstdc++ configury decides
   that wchar_t support should be disabled. Once the underlying problems
   are fixed in FreeBSD (soon), the library support will automatically
   enable itself.

   You can fix the problems yourself, and learn more about the situation,
   by reading [81]this short thread ("_GLIBCPP_USE_WCHAR_T undefined in
   FreeBSD's c++config.h?").
     _________________________________________________________________

3.10 MIPS atomic operations

   The atomic locking routines for MIPS targets requires MIPS II and
   later. A patch went in just after the 3.3 release to make mips* use
   the generic implementation instead. You can also configure for
   mipsel-elf as a workaround.

   mips*-*-linux* continues to use the MIPS II routines, and more work in
   this area is expected.
     _________________________________________________________________

                          4.0 Known Bugs and Non-Bugs

   Note that this section can get rapdily outdated -- such is the nature
   of an open-source project. For the latest information, join the
   mailing list or look through recent archives. The RELEASE- NOTES and
   BUGS files are generally kept up-to-date.

   For 3.0.1, the most common "bug" is an apparently missing "../" in
   include/Makefile, resulting in files like gthr.h and gthr-single.h not
   being found. Please read [82]the configuration instructions for GCC,
   specifically the part about configuring in a separate build directory,
   and how strongly recommended it is. Building in the source directory
   is fragile, is rarely tested, and tends to break, as in this case.
   This was fixed for 3.0.2.

   For 3.1, the most common "bug" is a parse error when using <fstream>,
   ending with a message, "bits/basic_file.h:52: parse error before `{'
   token." Please read [83]the installation instructions for GCC,
   specifically the part about not installing newer versions on top of
   older versions. If you install 3.1 over a 3.0.x release, then the
   wrong basic_file.h header will be found (its location changed between
   releases).

   Please do not report these as bugs. We know about them. Reporting this
   -- or any other problem that's already been fixed -- hinders the
   development of GCC, because we have to take time to respond to your
   report. Thank you.
     _________________________________________________________________

4.1 What works already?

   Short answer: Pretty much everything works except for some corner
   cases. Also, localization is incomplete. For whether it works well, or
   as you expect it to work, see 5.2.

   Long answer: See the docs/html/17_intro/CHECKLIST file, which is badly
   outdated... Also see the RELEASE-NOTES file, which is kept more up to
   date.
     _________________________________________________________________

4.2 Bugs in gcc/g++ (not libstdc++-v3)

   This is by no means meant to be complete nor exhaustive, but mentions
   some problems that users may encounter when building or using
   libstdc++. If you are experiencing one of these problems, you can find
   more information on the libstdc++ and the GCC mailing lists.

   Before reporting a bug, examine the [84]bugs database with the
   category set to "libstdc++". The BUGS file in the source tree also
   tracks known serious problems.
     * Debugging is problematic, due to bugs in line-number generation
       (mostly fixed in the compiler) and gdb lagging behind the compiler
       (lack of personnel). We recommend configuring the compiler using
       --with-dwarf2 if the DWARF2 debugging format is not already the
       default on your platform. Also, [85]changing your GDB settings can
       have a profound effect on your C++ debugging experiences. :-)
     _________________________________________________________________

4.3 Bugs in the C++ language/lib specification

   Yes, unfortunately, there are some. In a [86]message to the list,
   Nathan Myers announced that he has started a list of problems in the
   ISO C++ Standard itself, especially with regard to the chapters that
   concern the library. The list itself is [87]posted on his website.
   Developers who are having problems interpreting the Standard may wish
   to consult his notes.

   For those people who are not part of the ISO Library Group (i.e.,
   nearly all of us needing to read this page in the first place :-), a
   public list of the library defects is occasionally published [88]here.
   Some of these have resulted in [89]code changes.
     _________________________________________________________________

4.4 Things in libstdc++ that only look like bugs

   There are things which are not bugs in the compiler (4.2) nor the
   language specification (4.3), but aren't really bugs in libstdc++,
   either. Really! Please do not report these as bugs.

   -Weffc++ The biggest of these is the quadzillions of warnings about
   the library headers emitted when -Weffc++ is used. Making libstdc++
   "-Weffc++-clean" is not a goal of the project, for a few reasons.
   Mainly, that option tries to enforce object-oriented programming,
   while the Standard Library isn't necessarily trying to be OO.

   reopening a stream fails Did I just say that -Weffc++ was our biggest
   false-bug report? I lied. (It used to be.) Today it seems to be
   reports that after executing a sequence like
    #include <fstream>
    ...
    std::fstream  fs("a_file");
    // .
    // . do things with fs...
    // .
    fs.close();
    fs.open("a_new_file");

   all operations on the re-opened fs will fail, or at least act very
   strangely. Yes, they often will, especially if fs reached the EOF
   state on the previous file. The reason is that the state flags are not
   cleared on a successful call to open(). The standard unfortunately did
   not specify behavior in this case, and to everybody's great sorrow,
   the [90]proposed LWG resolution in DR #22 is to leave the flags
   unchanged. You must insert a call to fs.clear() between the calls to
   close() and open(), and then everything will work like we all expect
   it to work.

   rel_ops Another is the rel_ops namespace and the template comparison
   operator functions contained therein. If they become visible in the
   same namespace as other comparison functions (e.g., 'using' them and
   the <iterator> header), then you will suddenly be faced with huge
   numbers of ambiguity errors. This was discussed on the -v3 list;
   Nathan Myers [91]sums things up here. The collisions with
   vector/string iterator types have been fixed for 3.1.

  The g++-3 headers are not ours

   If you have found an extremely broken header file which is causing
   problems for you, look carefully before submitting a "high" priority
   bug report (which you probably shouldn't do anyhow; see the last
   paragraph of the page describing [92]the GCC bug database).

   If the headers are in ${prefix}/include/g++-3, or if the installed
   library's name looks like libstdc++-2.10.a or libstdc++-libc6-2.10.so,
   then you are using the old libstdc++-v2 library, which is nonstandard
   and unmaintained. Do not report problems with -v2 to the -v3 mailing
   list.

   For GCC versions 3.0 and 3.1 the libstdc++-v3 header files are
   installed in ${prefix}/include/g++-v3 (see the 'v'?). Starting with
   version 3.2 the headers are installed in
   ${prefix}/include/c++/${version} as this prevents headers from
   previous versions being found by mistake.

   glibc If you're on a GNU/Linux system and have just upgraded to glibc
   2.2, but are still using gcc 2.95.2, then you should have read the
   glibc FAQ, specifically 2.34:
2.34.   When compiling C++ programs, I get a compilation error in streambuf.h.

{BH} You are using g++ 2.95.2? After upgrading to glibc 2.2, you need to
apply a patch to the include files in /usr/include/g++, because the fpos_t
type has changed in glibc 2.2.  The patch is at
http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff


   Note that 2.95.x shipped with the [93]old v2 library which is no
   longer maintained. Also note that gcc 2.95.3 fixes this problem, but
   requires a separate patch for libstdc++-v3.

   concept checks If you see compilation errors containing messages about
   fooConcept and a constraints member function, then most likely you
   have violated one of the requirements for types used during
   instantiation of template containers and functions. For example,
   EqualityComparableConcept appears if your types must be comparable
   with == and you have not provided this capability (a typo, or wrong
   visibility, or you just plain forgot, etc).

   More information, including how to optionally enable/disable the
   checks, is available [94]here.

   dlopen/dlsym If you are using the C++ library across
   dynamically-loaded objects, make certain that you are passing the
   correct options when compiling and linking:
    // compile your library components
    g++ -fPIC -c a.cc
    g++ -fPIC -c b.cc
    ...
    g++ -fPIC -c z.cc

    // create your library
    g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o

    // link the executable
    g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl

   "memory leaks" in containers A few people have reported that the
   standard containers appear to leak memory when tested with memory
   checkers such as [95]valgrind. The library's default allocators keep
   free memory in a pool for later reuse, rather than returning it to the
   OS. Although this memory is always reachable by the library and is
   never lost, memory debugging tools can report it as a leak. If you
   want to test the library for memory leaks please read [96]Tips for
   memory leak hunting first.
     _________________________________________________________________

4.5 Aw, that's easy to fix!

   If you have found a bug in the library and you think you have a
   working fix, then send it in! The main GCC site has a page on
   [97]submitting patches that covers the procedure, but for libstdc++
   you should also send the patch to our mailing list in addition to the
   GCC patches mailing list. The libstdc++ [98]contributors' page also
   talks about how to submit patches.

   In addition to the description, the patch, and the ChangeLog entry, it
   is a Good Thing if you can additionally create a small test program to
   test for the presence of the bug that your patch fixes. Bugs have a
   way of being reintroduced; if an old bug creeps back in, it will be
   caught immediately by the [99]testsuite -- but only if such a test
   exists.
     _________________________________________________________________

                               5.0 Miscellaneous

5.1 string::iterator is not char*; vector<T>::iterator is not T*

   If you have code that depends on container<T> iterators being
   implemented as pointer-to-T, your code is broken.

   While there are arguments for iterators to be implemented in that
   manner, A) they aren't very good ones in the long term, and B) they
   were never guaranteed by the Standard anyway. The type-safety achieved
   by making iterators a real class rather than a typedef for T*
   outweighs nearly all opposing arguments.

   Code which does assume that a vector iterator i is a pointer can often
   be fixed by changing i in certain expressions to &*i . Future
   revisions of the Standard are expected to bless this usage for
   vector<> (but not for basic_string<>).
     _________________________________________________________________

5.2 What's next after libstdc++-v3?

   Hopefully, not much. The goal of libstdc++-v3 is to produce a
   fully-compliant, fully-portable Standard Library. After that, we're
   mostly done: there won't be any more compliance work to do. However:
    1. The ISO Committee will meet periodically to review Defect Reports
       in the C++ Standard. Undoubtedly some of these will result in
       changes to the Standard, which will be reflected in patches to
       libstdc++. Some of that is already happening, see 4.2. Some of
       those changes are being predicted by the library maintainers, and
       we add code to the library based on what the current proposed
       resolution specifies. Those additions are listed in [100]the
       extensions page.
    2. Performance tuning. Lots of performance tuning. This too is
       already underway for post-3.0 releases, starting with memory
       expansion in container classes and buffer usage in synchronized
       stream objects.
    3. An ABI for libstdc++ is being developed, so that multiple
       binary-incompatible copies of the library can be replaced with a
       single backwards-compatible library, like libgcc_s.so is.
    4. The current libstdc++ contains extensions to the Library which
       must be explicitly requested by client code (for example, the hash
       tables from SGI). Other extensions may be added to libstdc++-v3 if
       they seem to be "standard" enough. (For example, the "long long"
       type from C99.) Bugfixes and rewrites (to improve or fix thread
       safety, for instance) will of course be a continuing task.

   [101]This question about the next libstdc++ prompted some brief but
   interesting [102]speculation.
     _________________________________________________________________

5.3 What about the STL from SGI?

   The [103]STL from SGI, version 3.3, was the final merge of the STL
   codebase. The code in libstdc++ contains many fixes and changes, and
   the SGI code is no longer under active development. We expect that no
   future merges will take place.

   In particular, string is not from SGI and makes no use of their "rope"
   class (which is included as an optional extension), nor is valarray
   and some others. Classes like vector<> are, however we have made
   significant changes to them since then.

   The FAQ for SGI's STL (one jump off of their main page) is recommended
   reading.
     _________________________________________________________________

5.4 Extensions and Backward Compatibility

   Headers in the ext and backward subdirectories should be referred to
   by their relative paths:
      #include <ext/hash_map>

   rather than using -I or other options. This is more portable and
   forward-compatible. (The situation is the same as that of other
   headers whose directories are not searched directly, e.g.,
   <sys/stat.h>, <X11/Xlib.h>.

   The extensions are no longer in the global or std namespaces, instead
   they are declared in the __gnu_cxx namespace. For maximum portability,
   consider defining a namespace alias to use to talk about extensions,
   e.g.:
      #ifdef __GNUC__
      #if __GNUC__ < 3
        #include <hash_map.h>
        namespace Sgi { using ::hash_map; }; // inherit globals
      #else
        #include <ext/hash_map>
        #if __GNUC_MINOR__ == 0
          namespace Sgi = std;               // GCC 3.0
        #else
          namespace Sgi = ::__gnu_cxx;       // GCC 3.1 and later
        #endif
      #endif
      #else      // ...  there are other compilers, right?
        namespace Sgi = std;
      #endif

      Sgi::hash_map<int,int> my_map;

   This is a bit cleaner than defining typedefs for all the
   instantiations you might need.

   Note: explicit template specializations must be declared in the same
   namespace as the original template. This means you cannot use a
   namespace alias when declaring an explicit specialization.

   Extensions to the library have [104]their own page.
     _________________________________________________________________

5.5 [removed]

   This question has become moot and has been removed. The stub is here
   to preserve numbering (and hence links/bookmarks).
     _________________________________________________________________

5.6 Is libstdc++-v3 thread-safe?

   libstdc++-v3 strives to be thread-safe when all of the following
   conditions are met:
     * The system's libc is itself thread-safe,
     * gcc -v reports a thread model other than 'single',
     * [pre-3.3 only] a non-generic implementation of atomicity.h exists
       for the architecture in question.

   The user-code must guard against concurrent method calls which may
   access any particular library object's state. Typically, the
   application programmer may infer what object locks must be held based
   on the objects referenced in a method call. Without getting into great
   detail, here is an example which requires user-level locks:
     library_class_a shared_object_a;

     thread_main () {
       library_class_b *object_b = new library_class_b;
       shared_object_a.add_b (object_b);   // must hold lock for shared_object_
a
       shared_object_a.mutate ();          // must hold lock for shared_object_
a
     }

     // Multiple copies of thread_main() are started in independent threads.

   Under the assumption that object_a and object_b are never exposed to
   another thread, here is an example that should not require any
   user-level locks:
     thread_main () {
       library_class_a object_a;
       library_class_b *object_b = new library_class_b;
       object_a.add_b (object_b);
       object_a.mutate ();
     }

   All library objects are safe to use in a multithreaded program as long
   as each thread carefully locks out access by any other thread while it
   uses any object visible to another thread, i.e., treat library objects
   like any other shared resource. In general, this requirement includes
   both read and write access to objects; unless otherwise documented as
   safe, do not assume that two threads may access a shared standard
   library object at the same time.

   See chapters [105]17 (library introduction), [106]23 (containers), and
   [107]27 (I/O) for more information.
     _________________________________________________________________

5.7 How do I get a copy of the ISO C++ Standard?

   Copies of the full ISO 14882 standard are available on line via the
   ISO mirror site for committee members. Non-members, or those who have
   not paid for the privilege of sitting on the committee and sustained
   their two-meeting commitment for voting rights, may get a copy of the
   standard from their respective national standards organization. In the
   USA, this national standards organization is ANSI and their website is
   right [108]here. (And if you've already registered with them, clicking
   this link will take you to directly to the place where you can
   [109]buy the standard on-line.

   Who is your country's member body? Visit the [110]ISO homepage and
   find out!
     _________________________________________________________________

5.8 What's an ABI and why is it so messy?

   "ABI" stands for "Application Binary Interface." Conventionally, it
   refers to a great mass of details about how arguments are arranged on
   the call stack and/or in registers, and how various types are arranged
   and padded in structs. A single CPU design may suffer multiple ABIs
   designed by different development tool vendors who made different
   choices, or even by the same vendor for different target applications
   or compiler versions. In ideal circumstances the CPU designer presents
   one ABI and all the OSes and compilers use it. In practice every ABI
   omits details that compiler implementers (consciously or accidentally)
   must choose for themselves.

   That ABI definition suffices for compilers to generate code so a
   program can interact safely with an OS and its lowest-level libraries.
   Users usually want an ABI to encompass more detail, allowing libraries
   built with different compilers (or different releases of the same
   compiler!) to be linked together. For C++, this includes many more
   details than for C, and CPU designers (for good reasons elaborated
   below) have not stepped up to publish C++ ABIs. The details include
   virtual function implementation, struct inheritance layout, name
   mangling, and exception handling. Such an ABI has been defined for GNU
   C++, and is immediately useful for embedded work relying only on a
   "free-standing implementation" that doesn't include (much of) the
   standard library. It is a good basis for the work to come.

   A useful C++ ABI must also incorporate many details of the standard
   library implementation. For a C ABI, the layouts of a few structs
   (such as FILE, stat, jmpbuf, and the like) and a few macros suffice.
   For C++, the details include the complete set of names of functions
   and types used, the offsets of class members and virtual functions,
   and the actual definitions of all inlines. C++ exposes many more
   library details to the caller than C does. It makes defining a
   complete ABI a much bigger undertaking, and requires not just
   documenting library implementation details, but carefully designing
   those details so that future bug fixes and optimizations don't force
   breaking the ABI.

   There are ways to help isolate library implementation details from the
   ABI, but they trade off against speed. Library details used in inner
   loops (e.g., getchar) must be exposed and frozen for all time, but
   many others may reasonably be kept hidden from user code, so they may
   later be changed. Deciding which, and implementing the decisions, must
   happen before you can reasonably document a candidate C++ ABI that
   encompasses the standard library.
     _________________________________________________________________

5.9 How do I make std::vector<T>::capacity() == std::vector<T>::size()?

   The standard idiom for deallocating a std::vector<T>'s unused memory
   is to create a temporary copy of the vector and swap their contents,
   e.g. for std::vector<T> v
     std::vector<T>(v).swap(v);


   The copy will take O(n) time and the swap is constant time.

   See [111]Shrink-to-fit strings for a similar solution for strings.
     _________________________________________________________________

   See [112]license.html for copying conditions. Comments and suggestions
   are welcome, and may be sent to [113]the libstdc++ mailing list. 

References

   1. ../documentation.html
   2. ../17_intro/license.html
   3. http://gcc.gnu.org/onlinedocs/libstdc++/faq/
   4. http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html
   5. http://gcc.gnu.org/libstdc++/
   6. ../faq/index.html#1_0
   7. ../faq/index.html#1_1
   8. ../faq/index.html#1_2
   9. ../faq/index.html#1_3
  10. ../faq/index.html#1_4
  11. ../faq/index.html#1_5
  12. ../faq/index.html#1_6
  13. ../faq/index.html#1_7
  14. ../faq/index.html#1_8
  15. ../faq/index.html#1_9
  16. ../faq/index.html#2_0
  17. ../faq/index.html#2_1
  18. ../faq/index.html#2_2
  19. ../faq/index.html#2_3
  20. ../faq/index.html#2_4
  21. ../faq/index.html#2_5
  22. ../faq/index.html#2_6
  23. ../faq/index.html#3_0
  24. ../faq/index.html#3_1
  25. ../faq/index.html#3_2
  26. ../faq/index.html#3_3
  27. ../faq/index.html#3_4
  28. ../faq/index.html#3_5
  29. ../faq/index.html#3_6
  30. ../faq/index.html#3_7
  31. ../faq/index.html#3_8
  32. ../faq/index.html#3_9
  33. ../faq/index.html#3_10
  34. ../faq/index.html#4_0
  35. ../faq/index.html#4_1
  36. ../faq/index.html#4_2
  37. ../faq/index.html#4_3
  38. ../faq/index.html#4_4
  39. ../faq/index.html#4_4_iostreamclear
  40. ../faq/index.html#4_4_Weff
  41. ../faq/index.html#4_4_rel_ops
  42. ../faq/index.html#4_4_interface
  43. ../faq/index.html#4_4_glibc
  44. ../faq/index.html#4_4_checks
  45. ../faq/index.html#4_4_dlsym
  46. ../faq/index.html#4_4_leak
  47. ../faq/index.html#4_5
  48. ../faq/index.html#5_0
  49. ../faq/index.html#5_1
  50. ../faq/index.html#5_2
  51. ../faq/index.html#5_3
  52. ../faq/index.html#5_4
  53. ../faq/index.html#5_5
  54. ../faq/index.html#5_6
  55. ../faq/index.html#5_7
  56. ../faq/index.html#5_8
  57. ../faq/index.html#5_9
  58. ../faq/index.html#1_4
  59. ../faq/index.html#4_4_interface
  60. ../17_intro/DESIGN
  61. http://gcc.gnu.org/
  62. http://gcc.gnu.org/gcc-3.3/buildstat.html
  63. http://gcc.gnu.org/libstdc++/
  64. http://gcc.gnu.org/libstdc++/
  65. http://gcc.gnu.org/releases.html
  66. ../17_intro/contribute.html
  67. http://www.boost.org/
  68. http://gcc.gnu.org/extensions.html
  69. mailto:libstdc++@gcc.gnu.org
  70. mailto:pme@gcc.gnu.org
  71. mailto:gdr@gcc.gnu.org
  72. ../17_intro/license.html
  73. ../documentation.html
  74. ../17_intro/RELEASE-NOTES
  75. http://www.gnu.org/software/cvs/cvs.html
  76. http://www.cvshome.org/
  77. http://gcc.gnu.org/install/test.html
  78. ../18_support/howto.html
  79. http://gcc.gnu.org/cgi-bin/htsearch?method=and&format=builtin-long&sort=score&words=_XOPEN_SOURCE+Solaris
  80. http://gcc.gnu.org/ml/gcc/2002-03/msg00817.html
  81. http://gcc.gnu.org/ml/libstdc++/2003-02/subjects.html#00286
  82. http://gcc.gnu.org/install/configure.html
  83. http://gcc.gnu.org/install/
  84. http://gcc.gnu.org/bugs.html
  85. http://gcc.gnu.org/ml/libstdc++/2002-02/msg00034.html
  86. http://gcc.gnu.org/ml/libstdc++/1998/msg00006.html
  87. http://www.cantrip.org/draft-bugs.txt
  88. http://anubis.dkuug.dk/jtc1/sc22/wg21/
  89. ../faq/index.html#5_2
  90. ../ext/howto.html#5
  91. http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html
  92. http://gcc.gnu.org/bugs.html
  93. ../faq/index.html#4_4_interface
  94. ../19_diagnostics/howto.html#3
  95. http://developer.kde.org/~sewardj/
  96. ../debug.html#mem
  97. http://gcc.gnu.org/contribute.html
  98. ../17_intro/contribute.html
  99. ../faq/index.html#2_4
 100. ../ext/howto.html#5
 101. http://gcc.gnu.org/ml/libstdc++/1999/msg00080.html
 102. http://gcc.gnu.org/ml/libstdc++/1999/msg00084.html
 103. http://www.sgi.com/tech/stl/
 104. ../ext/howto.html
 105. ../17_intro/howto.html#3
 106. ../23_containers/howto.html#3
 107. ../27_io/howto.html#9
 108. http://www.ansi.org/
 109. http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003
 110. http://www.iso.ch/
 111. ../21_strings/howto.html#6
 112. ../17_intro/license.html
 113. mailto:libstdc++@gcc.gnu.org
