I don't really know how best to post the code snippets I have , but here's my best shot at it. Please do let me know if they are insufficient:
Class DnsHeader has an object m_header inside DnsPacket.
Main body:
DnsPacket *p ;
p = new DnsPacket(r);
assert (_CrtCheckMemory());
p->add_bytes(buf, r); // add bytes to a vector m_bytes inside DnsPacket
if (p->parse())
{
read_packet(sin, *p);
}
p->parse:
size_t size = m_bytes.size(); // m_bytes is a vector
  unsigned char *bytes = new u_char[m_bytes.size()];
  copy(m_bytes.begin(), m_bytes.end(), bytes); 
m_header = new DnsHeader();
  eprintf("m_header allocated at %x\n", m_header);
  assert(_CrtCheckMemory());
  if (m_header->init(bytes, size)) // just set the ID and a bunch of other ints here.
{
    size_t pos = DnsHeader::SIZE; // const int
    if (pos != size)
      ; // XXX perhaps generate a warning about extraneous data?
    if (ok)
      m_parsed = true;
  }
  else
  {
    m_parsed = false;
  }
  if (!ok) {
    m_parsed = false;
  }
  return m_parsed;
}
read_packet:
  DnsHeader& h = p.header();
  eprintf("The header ID is %d\n", h.id()); // ID is wrong here
...
DnsHeader constructor:
m_id = -1;
  m_qdcount = m_ancount = m_nscount = m_arcount = 0;
  memset(&m_flags, 0, sizeof(m_flags)); // m_flags is a struct
  m_flags.rd = 1;
p.header():
return *m_header;
m_header->init: (u_char* bytes, int size)
header_fmt *h = (header_fmt *)bytes;
m_id = ntohs(h->id);
eprintf("Assigning an id of %d/%d\n", ntohs(h->id), m_id); // ID is correct here
m_qdcount = ntohs(h->qdcount);
m_ancount = ntohs(h->ancount);
m_nscount = ntohs(h->nscount);
m_arcount = ntohs(h->arcount);