[Bug c++/80664] New: Destructor not called upon exception while initializing a vector
akrzemi1 at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon May 8 09:03:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80664
Bug ID: 80664
Summary: Destructor not called upon exception while
initializing a vector
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: akrzemi1 at gmail dot com
Target Milestone: ---
The following program logs calls to successful constructors and destructors of
class `R`. I expect the number of constructions to equal the number of
destructions. But when second construction fails, the destructor of the
previously fully created object is not called. This is becayse shared_ptr's
destructor is skipped! This happens when list-initializing a vector of
shared_ptr's:
```
#include <cstdio>
#include <memory>
#include <stdexcept>
#include <vector>
void acquire_resource() // emulates failure to acquire the second resource
{
static int resources_exhausted = 0;
if (resources_exhausted)
throw std::runtime_error("failed");
else
++resources_exhausted;
}
struct R
{
explicit R(int)
{
acquire_resource();
std::puts("create");
}
R(R const&) = delete; // no copying, no moving
~R() { std::puts("destroy"); }
};
int main()
{
try {
std::vector<std::shared_ptr<R>> v {
std::make_shared<R>(1), // created, but never destroyed
std::make_shared<R>(2) // creation fails for this one
};
}
catch (...) {}
}
```
I consider the bug serious as it undermines the trust in C++'s "RAII
philosophy".
More information about the Gcc-bugs
mailing list