Re: [boost] [circular_buffer] default constructor usually throws std::bad_alloc

This was an intended behaviour (to allocate the maximum capacity). The reason behind this was to comply with other STL containers. I admin the decision was not the best one. I will change this as you propose but in the Boost version 1.36. For now just use the constructor with the explicit capacity paramater or override the allocator's max_size() to return some sensible value. Jan ----- Original Message ---- From: Dean Michael Berris <mikhailberis@gmail.com> To: "boost@lists.boost.org" <boost@lists.boost.org> Sent: Thursday, 15 May, 2008 1:17:27 PM Subject: [boost] [circular_buffer] default constructor usually throws std::bad_alloc I've attached a trivial patch to circular buffer which should allow it to be default constructed (and copy from an existing buffer) without making the default constructor cause an insane request to allocate a huge amount of memory (and fail to throw an std::bad_alloc). I personally think this is a show stopper bug in Boost 1.35.0 and the patch is distributed under the Boost C++ License Version 1.0. Should this be applied to be made part of 1.35.1? -- Dean Michael C. Berris Software Engineer, Friendster, Inc. [http://blog.cplusplus-soup.com] [mikhailberis@gmail.com] [+63 928 7291459] [+1 408 4049523] __________________________________________________________ Sent from Yahoo! Mail. A Smarter Email http://uk.docs.yahoo.com/nowyoucan.html

On Thu, May 15, 2008 at 7:48 PM, Jan Gaspar <jano_gaspar@yahoo.com> wrote:
This was an intended behaviour (to allocate the maximum capacity). The reason behind this was to comply with other STL containers. I admin the decision was not the best one. I will change this as you propose but in the Boost version 1.36. For now just use the constructor with the explicit capacity paramater or override the allocator's max_size() to return some sensible value.
Actually, this is going to be really hard to do especially if you are expecting the buffer from another source and just need a default constructed "receiver" to get it: map<string, circular_buffer<char> > input_buffers; input_buffers.insert(std::make_pair("cin", circular_buffer<char>(1000))); input_buffers.insert(std::make_pair("net", circular_buffer<char>(2048))); circular_buffer<char> buffer; // this will throw string source; cin >> source; if (input_buffers.find(source) != input_buffers.end()) { buffer = input_buffers.find(source)->second; }; With the current implementation, you may not be able to get past the default constructed buffer, and if you did set some capacity, you'd be wasting memory. Shouldn't the change make it to Boost 1.35.1? :-D It's a really trivial fix for the constructor, but I haven't looked at how it will affect the other areas of the code. Thanks for the quick response! :) -- Dean Michael C. Berris Software Engineer, Friendster, Inc. [http://blog.cplusplus-soup.com] [mikhailberis@gmail.com] [+63 928 7291459] [+1 408 4049523]
participants (2)
-
Dean Michael Berris
-
Jan Gaspar