problem with (use of) std::vector
SYNOPSIS
=========
I am experiencing a strange problem, which I'm sure is caused by an
oversight on my part - but despite peering over the code for a few
hours, I have been able to spot the bug. I am writing a simple generic
value container. A generic value is implemented as a discriminated union
class (B), which is nested within the container class A. Class A stores
instances of generic values in a std::vector.
The container as described, works well for fundamental data types,
however, when I attempt to store pointer types (which are managed by
class B), a memory access/violation exception is thrown).
SAMPLE CODE TO REPRODUCE ISSUE
===============================
class A
{
public:
A(){}
~A(){}
size_t addValue(const std::string& s)
{
m_values.push_back(B(s.c_str()));
return m_values.size();
}
size_t addValue(const long l)
{
m_values.push_back(B(l));
return m_values.size();
}
private:
class B
{
public:
friend class A;
B():m_stype(false)
{
m_value.l = 0;
}
explicit B(const long l):m_stype(false)
{
m_value.l = l;
}
explicit B(const char* s):m_stype(true)
{
//error checking omitted for brevity
m_value.s = strdup(s);
}
~B()
{
if (m_stype && m_value.s)
free(m_value.s);
}
B(const B& b):m_stype(b.m_stype), m_value(b.m_value)
{}
B& operator= (const B& b)
{
if (this != &b)
{
//free any allocated resources first
if (m_stype && m_value.s)
{
free(m_value.s);
m_value.s = 0;
}
if (b.m_stype && b.m_value.s)
m_value.s = strdup(b.m_value.s);
else
m_value.l = b.m_value.l;
m_stype = b.m_stype;
}
return *this;
}
private:
union C
{
long l;
char* s;
}m_value;
bool m_stype ;
};
std::vector<B> m_values ;
};
int main(int argc, char* argv[])
{
A a;
a.addValue(100);
a.addValue("Hello"); //<- runtime error here
}
Can anyone spot the cause of this error?