Opened 10 years ago
Closed 10 years ago
#7114 closed Bugs (fixed)
Destructor not called when using emplace()
| Reported by: | Owned by: | Ion Gaztañaga | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | container |
| Version: | Boost 1.50.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
Consider the following source code:
#include <iostream>
#include <set>
#include <boost/container/flat_set.hpp>
struct foo
{
int i_;
foo(int i)
: i_(i)
{
std::cout << "foo() " << this << std::endl;
}
~foo()
{
std::cout << "~foo() " << this << std::endl;
}
foo(foo&& other)
: i_(other.i_)
{
std::cout << "foo(foo&&) " << this << std::endl;
}
foo&
operator=(foo&& other)
{
std::cout << "foo& operator=(foo&&)" << this << std::endl;
i_ = other.i_;
return *this;
}
bool
operator==(const foo& other)
const
{
return i_ == other.i_;
}
bool
operator<(const foo& other)
const
{
return i_ < other.i_;
}
};
int
main()
{
boost::container::flat_set<foo> set;
// std::set<foo> set;
std::cout << "*************" << std::endl;
set.emplace(42);
std::cout << "*************" << std::endl;
set.emplace(42);
std::cout << "*************" << std::endl;
return 0;
}
When compiled with clang 3.1 or gcc 4.8 and launched, it displays:
************* foo() 0x7fff6bfb29f8 foo(foo&&) 0x10c400900 ************* foo() 0x7fff6bfb29f8 ************* ~foo() 0x10c400900
Three instances are created (two constructors and one move-contructor), but only one destructor is called.
As a side note, when using an std::set (of the libc++) instead of a boost::container::flat_set, it displays:
************* foo() 0x10490091c ************* foo() 0x10490093c ~foo() 0x10490093c ************* ~foo() 0x10490091c
Note:
See TracTickets
for help on using tickets.

Thanks for the report, fixed in trunk at revision: 79422