2010-02-09 3 views
0

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

Он имеет метод:

inline int id() { return m_id; } 

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

debugger screenshot 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-> идентификатор() является встроенная функция в файле заголовка

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

Когда m_id установлен? Можете ли вы разместить больше фрагментов кода? Есть ли параллелизм в вашем коде? – coelhudo

+6

Здесь слишком мало информации, вы должны показать еще какой-нибудь код, или это просто догадки. Первое, что приходит в голову, это вызов метода на уничтоженном объекте. – nos

+1

Знаменитые последние слова: «Насколько я знаю, у меня нет проблем с избыточным буфером или выделениями» :) – jalf

ответ

4

Вы похоже, каким-то образом использует указатель на недопустимый класс.Возвращаемое значение показано это значение, которое VS обычно используется для инициализации памяти с:

2^32 - 842150451 = 0xCDCDCDCD 
+0

Строго говоря, VS будет инициализировать выделенную кучу память с помощью 0xcd, кучей освободить память с помощью 0xdd и стекю с 0xcc. – MSN

+0

Ничего себе! Очень быстрый ответ! Ценить это! Я также получаю (по-видимому) случайные значения, такие как 1573768653 (0x5dcdcdcd), 1379021363 (0x52323233), 1389219277 (ox52cdcdcd). Однако, что меня отталкивает, так это то, что когда я меняю функцию от встроенного до не-встроенного, все работает хорошо! – user269665

+0

@tdsmapper: С данной информацией я точно не знаю, что происходит. Если вы можете предоставить пример короткого кода, демонстрирующий проблему, это может помочь. Вероятно, кто-то сможет обнаружить проблему в секундах (по крайней мере, это то, что обычно происходит при переходе в stackoverflow). –

1
  1. Вы, вероятно, не инициализируется класс, что эта функция является членом.
  2. Не видя больше кода в контексте .. это может быть, что m_id выходит за рамки вы ожидаете, что это будет в.
0

Заново VC++. Это все фиксировало.

Благодарим вас за ваше время и поддерживаем всех! :) Ценить это!