Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова очередь, очередь содержит буффер 
:(
    Опции темы
webgraf
Дата 7.6.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Выдает ошибку при запуске(конкретно - при добавлении в очередь). Вроде как проблемы с кучей(dbgheap.c). Как правильно организовать в очередь из блоков данных?

Код

#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <queue>

// структура данных:
struct pdata
{
    unsigned char * buf;
    unsigned int size;
    
    // конструктор
    pdata(unsigned char *b, unsigned int s)
    {
        buf = (unsigned char *)malloc(s);
        memcpy(buf,b,s);
        size = s;
    }
    // деструктор
    ~pdata()
    {
        free(buf);
    }
};


int main(int argc, char* argv[])
{
    unsigned char * buf1 = (unsigned char *)malloc(1000);
    // объявляется очередь
    std::queue <pdata> q;

    memset(buf1,120,600); // тестовые данные
    
    q.push(pdata(buf1, 600)); // пробуем добавить
    q.pop();                  // и выкинуть
   
    return 0;
}


Это сообщение отредактировал(а) webgraf - 7.6.2007, 11:40
PM MAIL   Вверх
Fazil6
Дата 7.6.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



удалено

Это сообщение отредактировал(а) Fazil6 - 7.6.2007, 12:04
PM MAIL   Вверх
webgraf
Дата 7.6.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



а вот со строками все просто работает:
Код

#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <queue>

// структура данных:
struct pdata
{
    char name[20];
    char depart[20];
    
    // конструктор
    pdata(char *n, char *d )
    {
        strcpy(name,n);
        strcpy(depart,d);
    }
};


int main(int argc, char* argv[])
{

    // объявляется очередь
    std::queue <pdata> q;
   
    q.push(pdata("test1","test2")); // пробуем добавить
    q.pop();                  // и выкинуть
   
    return 0;
}


Как с блоками данных быть?
PM MAIL   Вверх
Fazil6
Дата 7.6.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(webgraf @  7.6.2007,  12:28 Найти цитируемый пост)
Как с блоками данных быть?

тебе нужен конструктор копии. Поумолчанию будет тупо копировать unsigned char * buf и потом при удалении твоих объектов pdata в деструкторе будет пытаться вызывать free 2 раза для одного и тогоже участка памяти
Код

struct pdata
{
    unsigned char * buf;
    unsigned int size;

    // конструктор

    pdata(unsigned char *b, unsigned int s)
    {
        buf = (unsigned char *)malloc(s);
        memcpy(buf,b,s);
        size = s;
    }

    pdata(const pdata &rhs  )
    {
        buf = (unsigned char *)malloc(rhs.size);
        memcpy(buf,rhs.buf,rhs.size);
        size = rhs.size;
    }
    // деструктор
    ~pdata()
    {
        free(buf);
    }
};

 

PM MAIL   Вверх
evGenie
Дата 7.6.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.6.2007
Где: Челябинск

Репутация: нет
Всего: 1



А в строчке 
Код

q.push(pdata(buf1, 600));

ведь сначала создается объект (вызывается конструктор), а потом происходит вызов конструктора копий? Который, сгенерированный по умолчанию, в твоем случае не работает, т.к. память выделяется с помощью malloc(). Определи соответствующий конструктор и все.
PM ICQ   Вверх
korbian
Дата 7.6.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



Констрктор копирования и оператор присваивания переопредели


--------------------
korbian ©
PM   Вверх
webgraf
Дата 7.6.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @  7.6.2007,  12:34 Найти цитируемый пост)
тебе нужен конструктор копии. Поумолчанию будет тупо копировать unsigned char * buf и потом при удалении твоих объектов pdata в деструкторе будет пытаться вызывать free 2 раза для одного и тогоже участка памяти

Т.е. теперь память выделяется при вызове конструтора копии?
PM MAIL   Вверх
korbian
Дата 7.6.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



Выделяешь новую память и копируешь в нее содержимое pdata::buf копируемого объекта.


--------------------
korbian ©
PM   Вверх
Fazil6
Дата 7.6.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(webgraf @  7.6.2007,  13:29 Найти цитируемый пост)
Т.е. теперь память выделяется при вызове конструтора копии?

память должна по идее выделяется при создании каждого нового объекта , а в твоем варианте при копировании объектов получалось, что 2 объекта владеют одной и тойже памятью
PM MAIL   Вверх
webgraf
Дата 7.6.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @  7.6.2007,  14:29 Найти цитируемый пост)
память должна по идее выделяется при создании каждого нового объекта , а в твоем варианте при копировании объектов получалось, что 2 объекта владеют одной и тойже памятью 

А деструктор не нужно править? У меня проблемы возникают когда pop делаю из очереди.  Не находит голову очереди.

korbian, не совсем понимаю... можешь кодом объяснить хоть немного?

Это сообщение отредактировал(а) webgraf - 7.6.2007, 15:29
PM MAIL   Вверх
Fazil6
Дата 7.6.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(webgraf @  7.6.2007,  15:29 Найти цитируемый пост)
А деструктор не нужно править? У меня проблемы возникают когда pop делаю из очереди.  Не находит голову очереди.

все он находит. В твоем коде
Код

q.push(pdata(buf1, 600));

после того как эта строка отработает, локальный объект переданный в параметре разрушается и вызывается деструктор, который делает 
Код

free(buf);

но из-за отсытствия твоего конструктора копии объект сохраненный в очередь ссылается на этуже память. И когда ты делаешь pop , вызывается деструктор этого объекта и вызывается повторно free(buf); но этот buf уже освобожден
Цитата(webgraf @  7.6.2007,  15:29 Найти цитируемый пост)
korbian, не совсем понимаю... можешь кодом объяснить хоть немного?

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

PM MAIL   Вверх
webgraf
Дата 7.6.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Fazil6, извини что отнимаю время своей тупостью, но пробую вот-так pop-ать :
Код

#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <queue>

// будем хранить данные в структуре типа:
struct pdata
{
    unsigned char * buf;
    unsigned int size;

    // конструктор

    pdata(unsigned char *b, unsigned int s)
    {
        buf = (unsigned char *)malloc(s);
        memcpy(buf,b,s);
        size = s;
    }

    pdata(const pdata &rhs  )
    {
        buf = (unsigned char *)malloc(rhs.size);
        memcpy(buf,rhs.buf,rhs.size);
        size = rhs.size;
    }
    // деструктор
    ~pdata()
    {
        free(buf);
    }
};



int main(int argc, char* argv[])
{
    unsigned char tr;
    unsigned char * buf1 = (unsigned char *)malloc(1000);

    std::queue <pdata> q;
    

    memset(buf1,120,600);     // тестовые данные
    q.push(pdata(buf1, 600));

    memset(buf1,110,600);     // тестовые данные
    q.push(pdata(buf1, 600));

    memset(buf1,100,600);      // тестовые данные
    q.push(pdata(buf1, 600));
    
    if(q.size()>0)
    {
        pdata &info = q.front();
        tr = *(unsigned char *)info.buf;
        printf("%d size=%d\n",tr,q.size());
        q.pop();
    }

    while(!_kbhit());
    return 0;
}

И получаю как раз результат - второй раз front не находит голову. Это как раз из-за оператора присваивания? 
PM MAIL   Вверх
korbian
Дата 8.6.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



Код

pdata& operator=(const pdata &rhs)
{
  if(this != &rhs)
  {
     if(buf != 0)
     {
         free(buf);
     }
      buf = (unsigned char *)malloc(rhs.size);
      memcpy(buf,rhs.buf,rhs.size);
      size = rhs.size;
  }
  return *this;
}

pdata(const pdata &rhs)
 :buf(0), size(0)
{
  this->operator=(rhs);
}



--------------------
korbian ©
PM   Вверх
webgraf
Дата 8.6.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Код

pdata(const pdata &rhs)
 уже прописан в конструкторе
если убрать из конструктора, все равно не присваивает ((
вот что получается:
Код

#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <queue>

// будем хранить данные в структуре типа:
struct pdata
{
    unsigned char * buf;
    unsigned int size;

    // конструктор

    pdata(unsigned char *b, unsigned int s)
    {
        buf = (unsigned char *)malloc(s);
        memcpy(buf,b,s);
        size = s;
    }

    //pdata(const pdata &rhs  )
    //{
    //    buf = (unsigned char *)malloc(rhs.size);
    //    memcpy(buf,rhs.buf,rhs.size);
    //    size = rhs.size;
    //}
    //
    
    // деструктор
    ~pdata()
    {
        free(buf);
    }

    pdata& operator=(const pdata &rhs)
    {
      if(this != &rhs)
      {
         if(buf != 0)
         {
             free(buf);
         }
          buf = (unsigned char *)malloc(rhs.size);
          memcpy(buf,rhs.buf,rhs.size);
          size = rhs.size;
      }
      return *this;
    }

    pdata(const pdata &rhs)
     :buf(0), size(0)
    {
      this->operator=(rhs);
    }
};



int main(int argc, char* argv[])
{
    unsigned char tr;
    unsigned char * buf1 = (unsigned char *)malloc(1000);

    std::queue <pdata> q;
    

    memset(buf1,120,600);
    q.push(pdata(buf1, 600));

    memset(buf1,110,600);
    q.push(pdata(buf1, 600));

    memset(buf1,100,600);
    q.push(pdata(buf1, 600));
    
    pdata &info = q.front();

    if(q.size()>0)
    {
        info = q.front();                    // присваивание
        tr = *(unsigned char *)info.buf;
        printf("%d size=%d\n",tr,q.size());
        q.pop();
    }

    while(!_kbhit());
    return 0;
}

PM MAIL   Вверх
Fazil6
Дата 8.6.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(webgraf @  8.6.2007,  11:31 Найти цитируемый пост)
 info = q.front();                    // присваивание

нету здесь присваивания... info у тебя не объект, а ссылка

Добавлено через 3 минуты и 26 секунд
точнее здесь уже есть присваивание, но самому себе

Добавлено через 9 минут и 47 секунд
вообще так работая ты получишь конечно эксепшен. 

Код

pdata &info = q.front();   // инициализируешь ссылку объектом

.....

q.pop(); // удаляешь объект которым инициализирована ссылка
// если теперь сделать так
info = q.front(); // то получишь чпок, потому что ссылка невалидная, а для ее объекта вызывается оператор =

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.