Функция имеет поврежденное возвращаемое значениеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Функция имеет поврежденное возвращаемое значение

Сообщение Anonymous »

У меня есть ситуация в Visual C++ 2008, которую я раньше не видел. У меня есть класс с четырьмя объектами STL (точнее, списком и вектором) и целыми числами.

У него есть метод:

inline int id() { return m_id; }


Возвращаемое значение этого метода повреждено, и я понятия не имею, почему.

Снимок экрана отладчика http: //img687.imageshack.us/img687/6728/returnvalue.png

Мне хотелось бы верить, что это разгром стека, но, насколько я знаю, у меня есть нет переполнения или выделения буфера проблемы.



Еще несколько наблюдений
Вот что меня отталкивает. Отладчик печатает правильные значения в указанном месте // неправильный идентификатор.

m_header = new DnsHeader();
assert(_CrtCheckMemory());

if (m_header->init(bytes, size))
{
eprintf("0The header ID is %d\n", m_header->id()); // wrong ID!!!


внутри m_header->init()

m_qdcount = ntohs(h->qdcount);
m_ancount = ntohs(h->ancount);
m_nscount = ntohs(h->nscount);
m_arcount = ntohs(h->arcount);
eprintf("The details are %d,%d,%d,%d\n", m_qdcount, m_ancount, m_nscount, m_arcount);

// copy the flags
// this doesn't work with a bitfield struct :(
// memcpy(&m_flags, bytes + 2, sizeof(m_flags));
//unpack_flags(bytes + 2); //TODO
m_init = true;
}
eprintf("Assigning an id of %d\n", m_id); // Correct ID.
return


m_header->id() — это встроенная функция в файле заголовка

inline int id() { return m_id; }




Я действительно не знаю, как лучше опубликовать имеющиеся у меня фрагменты кода, но вот мой лучший способ это сделать. . Пожалуйста, дайте мне знать, если их недостаточно:

Класс DnsHeader имеет объект m_header внутри DnsPacket.

Основная часть:

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->анализ:

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:

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* байт, размер int)

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);


Подробнее здесь: https://stackoverflow.com/questions/223 ... turn-value
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»