stdcxx-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Farid Zaripov (JIRA)" <j...@apache.org>
Subject [jira] Created: (STDCXX-1037) Bug in vector::swap() with unequal allocators
Date Tue, 04 Aug 2009 13:55:14 GMT
Bug in vector::swap() with unequal allocators
---------------------------------------------

                 Key: STDCXX-1037
                 URL: https://issues.apache.org/jira/browse/STDCXX-1037
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 23. Containers
    Affects Versions: 4.2.1, 4.2.0, 4.1.4, 4.1.3
         Environment: All
            Reporter: Farid Zaripov
            Assignee: Farid Zaripov
            Priority: Minor
             Fix For: 4.2.2


  The test below fails with assertion:

{noformat}
Assertion failed: 1 == v1.size() && 2 == v1.front(), file test.cpp, line 32

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
{noformat}

{code:title=test.cpp}
#include <cassert>
#include <memory>
#include <vector>

template <typename T>
class Alloc : public std::allocator<T>
{
public:
    Alloc(int i) : i_(i) { }

    int i_;
};

template <typename T>
bool operator==(const Alloc<T>& a1, const Alloc<T>& a2)
{
    return a1.i_ == a2.i_;
}

int main ()
{
    std::vector<int, Alloc<int> > v1(Alloc<int>(1));
    v1.push_back(1);
    assert(1 == v1.size() && 1 == v1.front());

    std::vector<int, Alloc<int> > v2(Alloc<int>(2));
    v2.push_back(2);
    assert(1 == v2.size() && 2 == v2.front());

    v1.swap(v2);

    assert(1 == v1.size() && 2 == v1.front());
    assert(1 == v2.size() && 1 == v2.front());

    return 0;
}
{code}

The bug was introduced in [r355174|http://svn.apache.org/viewvc?view=rev&revision=355174]

The proposed patch:
{code:title=vector.cc.diff}
Index: vector.cc
===================================================================
--- vector.cc	(revision 800774)
+++ vector.cc	(working copy)
@@ -133,6 +133,7 @@
     _RWSTD_ASSERT (__tmp.get_allocator () == __other.get_allocator ());
 
     __tmp.assign (begin (), end ());
+    assign (__other.begin (), __other.end ());
     __other.swap (__tmp);
 }
{code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message