2011-06-11 2 views
1

Я создал вектор объектов класса. Следующая программа вылетает сВектор объектов класса

"Pointer being freed was not allocated". 

У меня также есть много копий. Я не вижу, где происходит двойное удаление. Что мне не хватает?.

#include <iostream> 
    #include <vector> 
    using namespace std; 

    enum MessageType { HEADER, DATA, CLOSE}; 

    typedef class bufferElement{ 

    public: 
     char *buffer ; //The actual data 
     int64_t length; //length of the data 
     MessageType messagetype;  

     /** 
     * Copy constructor for the structure 
     */ 
     bufferElement(const struct bufferElement &toCopy) 
     { 
      std::cout << "Copying the buffer vector - Copy Constructor for buffer" << std::endl; 
      buffer = new char[toCopy.length]; 
      memcpy(buffer,toCopy.buffer,toCopy.length); 
      length = toCopy.length; 
      messagetype = toCopy.messagetype; 
     } 


     bufferElement() 
     { 
      buffer = NULL; 
      length =0; 
      messagetype = HEADER; 
     } 

     /** 
     * Initialises the vector element 
     * @param messagetype 
     * what type of message is the particular element. 
     * @param element 
     * The buffer element 
     * @param length_t 
     * The length/size of the buffer element 
     */ 
     bufferElement(char *element, int64_t length_t, MessageType messagetype_t) //constructor 
     { 
      std::cout << "The buffer element is Initialized" << std::endl; 
      buffer = new char[length_t]; 
      messagetype = messagetype_t; 
      length = length_t; 
      memcpy(buffer, element, length_t); 
     } 

     ~bufferElement() 
     { 
      std::cout << "Freeing the buffer in the vector - Destructor" << std::endl; 
      delete buffer; 
      buffer = NULL; 
     } 


    } messageHolder; 

    int main() 
    { 
     vector<messageHolder> v; 
     for(int64_t i=0; i< 1000000000000000000; i++) 
     { 
      int size = rand()%10000+5; 
      char *test = new char[size]; 
      messageHolder m(test, size, HEADER); 
      v.push_back(m); 

      if(rand()%3) 
      { 
       v.erase(v.begin()); 
      } 

     } 

     return 0; 
    } 

ответ

5

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

+0

У всех нас была эта фаза «изобретать колесо». Я думаю. По крайней мере, я тоже. – Dani

+0

Ну, это урезанная версия более крупного кода, над которым я работаю. Я просто хотел воспроизвести ошибку с меньшим количеством строк. Для оригинала просто строка не работает для меня. – Naveen

+0

@Naveen Да. –

3

Использование delete[] вместо delete, так как вы освободив массив.

Кстати, в main() вы также должны вызывать delete[] test;, в противном случае вы получите утечку памяти.

+0

Да, это исправлено. Но, тем не менее, он падает. – Naveen

0

В общем, я бы избегал использовать объекты с указателями в качестве элементов (например, buffer в вашем bufferElement) как типы в векторе (или любой другой stl-контейнер, если на то пошло) без конструктора копирования И оператора присваивания. Если деструктор освобождает этот указатель, это рецепт уничтожения. Вы должны eighter
а) обеспечить как копию угрозы и оп назначения

ИЛИ

б) не использовать указатели (использовать смарт-указатели, как повышение :: scoped_ptr или увеличить: shared_ptr или даже в случае auto_ptr) который я предпочитаю больше

Смежные вопросы