public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: libstdc++/2773: "allocator" not used by stringstream!
@ 2001-05-08  8:06 Carlo Wood
  0 siblings, 0 replies; 3+ messages in thread
From: Carlo Wood @ 2001-05-08  8:06 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR libstdc++/2773; it has been noted by GNATS.

From: Carlo Wood <carlo@alinoe.com>
To: gcc-gnats@gcc.gnu.org
Cc: gcc-bugs@gcc.gnu.org
Subject: Re: libstdc++/2773: "allocator" not used by stringstream!
Date: Tue, 8 May 2001 17:04:39 +0200

 On Tue, May 08, 2001 at 02:24:19PM -0000, carlo@alinoe.com wrote:
 > >Number:         2773
 > >Category:       libstdc++
 > >Synopsis:       "allocator" not used by stringstream!
 
 Please close this PR...  I forgot to declare 'rebind' :/
 No bug.
 
 -- 
 Carlo Wood <carlo@alinoe.com>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: libstdc++/2773: "allocator" not used by stringstream!
@ 2001-05-08  7:36 Carlo Wood
  0 siblings, 0 replies; 3+ messages in thread
From: Carlo Wood @ 2001-05-08  7:36 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR libstdc++/2773; it has been noted by GNATS.

From: Carlo Wood <carlo@alinoe.com>
To: gcc-gnats@gcc.gnu.org
Cc:  
Subject: Re: libstdc++/2773: "allocator" not used by stringstream!
Date: Tue, 8 May 2001 16:31:27 +0200

 Something went wrong with the copy and paste :/
 Please accept the following correction:
 
 On Tue, May 08, 2001 at 02:24:19PM -0000, carlo@alinoe.com wrote:
 > >Synopsis:       "allocator" not used by stringstream!
 
 >   print("Writing 10000013 characters to stringstream:\n");
 >   for (int i = 0; i < 100000; ++i)
 >     ss << "01234567890123456789012345678901234567890123456789012345678901234567890123456789012  ss << "Test " << 123.456 << '\n';
 
 Should be:
 
   print("Writing 10000013 characters to stringstream:\n");
   for (int i = 0; i < 100000; ++i)
     ss << "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
   ss << "Test " << 123.456 << '\n';
 
 
 
 -- 
 Carlo Wood <carlo@alinoe.com>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* libstdc++/2773: "allocator" not used by stringstream!
@ 2001-05-08  7:26 carlo
  0 siblings, 0 replies; 3+ messages in thread
From: carlo @ 2001-05-08  7:26 UTC (permalink / raw)
  To: gcc-gnats

>Number:         2773
>Category:       libstdc++
>Synopsis:       "allocator" not used by stringstream!
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue May 08 07:26:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Carlo Wood
>Release:        gcc version 3.0 20010423 (prerelease)
>Organization:
>Environment:
i686-pc-linux-gnu
>Description:
To my surprice I found that stringstream (etc) calls
directly malloc/free instead of Allocator::allocate()
as it should.

Consider the following test program:

----------------------------------------------------------
#include <new>
#include <cstdlib>
#define _GLIBCPP_FULLY_COMPLIANT_HEADERS
#include <sstream>
#include <iostream>
 
#include <unistd.h>     // Needed for 'write'
static bool start = false;
#define print(x) if (start) write(1, x, sizeof(x));
 
void* operator new(size_t size)
{
  print("Calling new\n");
  return malloc(size);
}
 
void* operator new[](size_t size)
{
  print("Calling new[]\n");
  return malloc(size);
}
 
void operator delete(void* ptr)
{
  print("Calling delete\n");
  free(ptr);
}
 
void operator delete[](void* ptr)
{
  print("Calling delete[]\n");
  free(ptr);
}
 
class my_allocator : public std::allocator<char> {
public:
  pointer allocate(size_type size, std::allocator<void>::const_pointer hint = 0)
  {
    print("Calling allocate\n");
    return new char [size];
  }
  void deallocate(pointer p, size_type)
  {
    print("Calling deallocate\n");
    delete [] p;
  }
};
 
typedef std::basic_stringstream<char, std::char_traits<char>, my_allocator> my_stringstream;
 
size_t size;
 
void test(void)
{
  my_stringstream ss;
  print("Writing 12 characters to stringstream:\n");
  ss << "Test " << 123456 << '\n';
  print("Writing 10000013 characters to stringstream:\n");
  for (int i = 0; i < 100000; ++i)
    ss << "01234567890123456789012345678901234567890123456789012345678901234567890123456789012  ss << "Test " << 123.456 << '\n';
  print("Done writing to stringstream.\n");
  size = ss.rdbuf()->pubseekoff(0, std::ios_base::cur, std::ios_base::out) -
         ss.rdbuf()->pubseekoff(0, std::ios_base::cur, std::ios_base::in);
  print("Destructing stringstream object\n");
}
 
int main(void)
{
  start = true;
  print("Start test\n");
  new char [10];
  test();
  print("End test\n");
  start = false;
  std::cout << "Size of stringstream buffer was: " << size << '\n';
  return 0;
}
-------------------------------------------------------

The output of this program is:

Start test
Calling new[]
Calling new
Writing 12 characters to stringstream:
Calling new
Calling new
Writing 10000013 characters to stringstream:
Done writing to stringstream.
Destructing stringstream object
Calling delete
Calling delete
Calling delete
End test
Size of stringstream buffer was: 10000025


Prove that the buffer of over 10 Mb was allocated with
malloc was found by linking with a malloc library that
prints every call to malloc/free, then the output is:

[Calling malloc(112) = 0x805491a][Calling malloc(36) = 0x8054990][Calling malloc(14) = 0x80549ba][Calling malloc(12) = 0x80549ce][Calling malloc(52) = 0x80549e0][Calling malloc(8) = 0x8054a1a][Calling malloc(28) = 0x8054a2c][Calling malloc(8) = 0x8054a4e][Calling malloc(40) = 0x8054a60][Calling malloc(13) = 0x8054a8e][Calling malloc(40) = 0x8054aa0][Calling malloc(8) = 0x8054ace][Calling malloc(8) = 0x8054ae0][Calling malloc(24) = 0x8054af2][Calling malloc(13) = 0x8054b10][Calling malloc(17) = 0x8054b22][Calling malloc(18) = 0x8054b38][Calling malloc(8) = 0x8054b50][Calling malloc(8) = 0x8054b62][Calling malloc(16) = 0x8054b74][Calling malloc(8) = 0x8054b8a][Calling malloc(8) = 0x8054b9c][Calling malloc(104) = 0x8054bae][Calling free(0x80549e0)][Calling malloc(4)[Calling free(0x80549f2)] = 0x80549e0][Calling malloc(12)[Calling free(0x8054a04)] = 0x80549f2][Calling malloc(364) = 0x8054c1c][Calling malloc(8192) = 0x8054d8e][Calling malloc(1) = 0x8054a04][Calling malloc(112) = 0x8056d94][Calling malloc(12) = 0x8056e0a][Calling malloc(364) = 0x8056e1c][Calling malloc(8192) = 0x8056f8e][Calling malloc(1) = 0x8058f94][Calling malloc(112) = 0x8058fa6][Calling malloc(12) = 0x805901c][Calling malloc(364) = 0x805902e][Calling malloc(8192) = 0x80591a0][Calling malloc(1) = 0x805b1a6]Start test
Calling new[]
[Calling malloc(10) = 0x805b1b8]Calling new
[Calling malloc(84) = 0x805b1ca]Writing 12 characters to stringstream:
[Calling malloc(1037) = 0x805b224]Calling new
[Calling malloc(20) = 0x805b636][Calling malloc(17) = 0x805b650][Calling malloc(18) = 0x805b666]Calling new
[Calling malloc(16) = 0x805b67e]Writing 10000013 characters to stringstream:
[Calling malloc(1037) = 0x805b694][Calling free(0x805b224)][Calling malloc(2061) = 0x805baa6][Calling free(0x805b694)][Calling malloc(2061) = 0x805c2b8][Calling free(0x805baa6)][Calling malloc(4109) = 0x805caca][Calling free(0x805c2b8)][Calling malloc(4109)[Calling free(0x805c6a6)] = 0x805b694][Calling free(0x805caca)][Calling malloc(8205) = 0x805c6a6][Calling free(0x805b694)][Calling malloc(8205) = 0x805e6b8][Calling free(0x805c6a6)][Calling malloc(16397) = 0x80606ca][Calling free(0x805e6b8)][Calling malloc(16397)[Calling free(0x805f6a6)] = 0x805b694][Calling free(0x80606ca)][Calling malloc(32781) = 0x805f6a6][Calling free(0x805b694)][Calling malloc(32781) = 0x80676b8][Calling free(0x805f6a6)][Calling malloc(65549) = 0x806f6ca][Calling free(0x80676b8)][Calling malloc(65549)[Calling free(0x806b6a6)] = 0x805b694][Calling free(0x806f6ca)][Calling malloc(131085) = 0x806b6a6][Calling free(0x805b694)][Calling malloc(131085) = 0x808b6b8][Calling free(0x806b6a6)][Calling malloc(262157) = 0x80ab6ca][Calling free(0x808b6b8)][Calling malloc(262157)[Calling free(0x809b6a6)] = 0x805b694][Calling free(0x80ab6ca)][Calling malloc(524301) = 0x809b6a6][Calling free(0x805b694)][Calling malloc(524301) = 0x811b6b8][Calling free(0x809b6a6)][Calling malloc(1048589) = 0x819b6ca][Calling free(0x811b6b8)][Calling malloc(1048589)[Calling free(0x815b6a6)] = 0x805b694][Calling free(0x819b6ca)][Calling malloc(2097165) = 0x815b6a6][Calling free(0x805b694)][Calling malloc(2097165) = 0x835b6b8][Calling free(0x815b6a6)][Calling malloc(4194317) = 0x855b6ca][Calling free(0x835b6b8)][Calling malloc(4194317)[Calling free(0x845b6a6)] = 0x805b694][Calling free(0x855b6ca)][Calling malloc(8388621) = 0x845b6a6][Calling free(0x805b694)][Calling malloc(8388621) = 0x8c5b6b8][Calling free(0x845b6a6)][Calling malloc(16777229) = 0x945b6ca][Calling free(0x8c5b6b8)]Done writing to stringstream.
Destructing stringstream object
[Calling free(0x945b6ca)]Calling delete
[Calling free(0x805b1ca)][Calling free(0x805b666)][Calling free(0x805b650)]Calling delete
[Calling free(0x805b636)]Calling delete
[Calling free(0x805b67e)]End test
[Calling malloc(20)[Calling free(0x805b1e4)] = 0x805b1ca][Calling malloc(17)[Calling free(0x805b1fa)] = 0x805b1e4][Calling malloc(18)[Calling free(0x805b212)] = 0x805b1fa][Calling malloc(16)[Calling free(0x805b228)] = 0x805b212]Size of stringstream buffer was: 10000025
[Calling free(0x8054d8e)][Calling free(0x8054a04)][Calling free(0x8054c1c)][Calling free(0x80549f2)][Calling free(0x805491a)][Calling free(0x8056f8e)][Calling free(0x8058f94)][Calling free(0x8056e1c)][Calling free(0x8056e0a)][Calling free(0x8056d94)][Calling free(0x80591a0)][Calling free(0x805b1a6)][Calling free(0x805902e)][Calling free(0x805901c)][Calling free(0x8058fa6)]

Is there any reason for not supporting an allocator?
Or is this really an (unintentional) bug?
>How-To-Repeat:

>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2001-05-08  8:06 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-05-08  8:06 libstdc++/2773: "allocator" not used by stringstream! Carlo Wood
  -- strict thread matches above, loose matches on Subject: below --
2001-05-08  7:36 Carlo Wood
2001-05-08  7:26 carlo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).