[odb-users] std bad allocation

Сергей Никонов shprotello at mail.ru
Tue Nov 28 05:35:51 EST 2017


Hello,

I receive the std::bad_allocation exception when try to update a BLOB field in the persistent object with two BLOBs put in two sections:

#pragma db object
    class product 
    {
    public:
      typedef std::uint64_t id_t;
      typedef std::vector<char> image_t;
      typedef std::vector<char> bson_t;

      product();
      ~product() {}

      id_t id() const { return m_id; }

      const odb::section& image_section() const { return m_image_section; }
      odb::section& image_section() { return m_image_section; }

      const odb::section& bson_section() const { return m_bson_section; }
      odb::section& bson_section() { return m_bson_section; }

      // ...

    private:
      friend class odb::access;

      product() : m_id(0) {}

    private:
#pragma db id auto
      id_t m_id;
#pragma db load(lazy) update(manual)
      odb::section m_image_section;
#pragma db null type("BYTEA") section(m_image_section)
      image_t m_image;
#pragma db load(lazy) update(manual)
      odb::section m_bson_section;
#pragma db null type("BYTEA") section(m_bson_section)
      image_t m_bson;
    };

This is a sample code that generates the exception:

auto product = db.load<product>(product_id);
// The line below throws std::bad_alloc
db.load(*product, product->bson_section());
// -------------------------------------------------------
product->bson(buffer);
db.update(*product, product->bson_section());

This is the place in the generated code that throws the exception.  i.m_image_size here is 14829735431805717965, but at the same time i.m_image_null is true (m_image field is NULL in the database). The error takes place if the m_bson field isn't NULL in the database.

bool access::object_traits_impl< ::product, id_pgsql >::bson_section_traits::
  grow (image_type& i,
        bool* t)
  {
    ODB_POTENTIALLY_UNUSED (i);
    ODB_POTENTIALLY_UNUSED (t);

    bool grew (false);

    // m_id
    //
    t[0UL] = 0;

    // m_owner
    //
    t[1UL] = 0;

    // m_item
    //
    if (t[2UL])
    {
      i.m_item_value.capacity (i.m_item_size);
      grew = true;
    }

    // m_image
    //
    if (t[3UL])
    {
      i.m_image_value.capacity (i.m_image_size);
      grew = true;
    }

    // m_bson
    //
    if (t[4UL])
    {
      i.m_bson_value.capacity (i.m_bson_size);
      grew = true;
    }

    return grew;
  }

Similar error happens from time to time for other classes in similar situations.

Regards,
Sergey


More information about the odb-users mailing list