C++ удаление произвольного блока данных

Тема в разделе "WASM.BEGINNERS", создана пользователем mixkorshun, 23 июн 2009.

  1. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    подскажите как в c++ удалить блок данных: указатель(LPVOID void*), размер cbSize
    Код (Text):
    1. void FIFOList::DeleteItem(LPVOID pItem){
    2.     delete pItem;
    3. }
    Код (Text):
    1. void FIFOList::DeleteItem(LPVOID pItem){
    2.     char* pTemp;
    3.     pTemp = (char*)pItem;
    4.     delete[szSize] pTemp;
    5. }
    эти варианты у меня не прошли (первый то ясно, а второй доработать вроде как недолго уже, наверно..)
     
  2. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    а выделяли то как?
     
  3. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    выделял
    Код (Text):
    1. pTmp = new char[sbSize];
    прям из проги скопировал, т.е я выделял память для массива char длины sbSize что эквивалент cbSize byte. Дальше половина уходит в структуру листа, а остальное под данные.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    delete[] pTemp;
     
  5. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    не подошло, хоть убей ошибка в куче, хотя указатель правильный..
     
  6. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    ошибка
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Тогда исходник в студию.
     
  8. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    как я понял - это утечка памяти....
     
  9. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    Код (Text):
    1. #include <windows.h>
    2. #include <iostream>
    3. //List item struct
    4.  
    5. struct FIFOListItem{
    6.     struct FIFOListItem *pNext, *pPrevious;
    7.     int cbSize;
    8. };
    9.  
    10.  
    11. class FIFOList{
    12. public:
    13.     void Initalize(int DataSize);
    14.     ~FIFOList();
    15.     bool PushItem(LPVOID pData);
    16.     void PopItem(LPVOID pData);
    17. private:
    18.     FIFOListItem* CreateItem(void);
    19.     void DeleteItem(LPVOID pItem);
    20.     int szSize;
    21.     int szDataSize;
    22.     FIFOListItem* pFirstItem;
    23.     FIFOListItem* pLastItem;
    24. };
    25.  
    26. void FIFOList::Initalize(int DataSize){
    27.     szDataSize = DataSize;
    28.     szSize = sizeof(FIFOListItem) + sizeof(DataSize);
    29.     pFirstItem = new FIFOListItem;
    30.     pFirstItem->pPrevious = NULL;
    31.     pFirstItem->pNext     = NULL;
    32.     pFirstItem->cbSize    = 0;//FIFOList::cbDataSize, but this's null item(start item), which has point of next items
    33.     pLastItem = pFirstItem;
    34. }
    35.  
    36. FIFOList::~FIFOList(){
    37.     while (pLastItem != pFirstItem){
    38.         delete pLastItem;
    39.     }
    40.     delete[12] pFirstItem;
    41. }
    42.  
    43. bool FIFOList::PushItem(LPVOID pData){
    44.     FIFOListItem *pTemp;//, *pTemp1;
    45.     pTemp = CreateItem();
    46.     if(pTemp != NULL){
    47.     memcpy((pTemp+sizeof(FIFOListItem)), pData, szDataSize);//add data of item
    48.     pLastItem->pNext = pTemp;
    49.     pTemp->pPrevious = pLastItem;
    50.     pLastItem = pTemp;
    51.     return true;
    52.     } else {
    53.         return false;
    54.     }
    55. }
    56.  
    57. void FIFOList::PopItem(LPVOID pData){
    58.     LPVOID pTemp;
    59.     pTemp = pLastItem;
    60.     memcpy(pData, (pLastItem + sizeof(FIFOListItem)), szDataSize);
    61.     pLastItem = pLastItem->pPrevious;
    62.     pLastItem->pNext = NULL;
    63.     DeleteItem(pTemp);
    64. }
    65.  
    66.  
    67. FIFOListItem* FIFOList::CreateItem(){
    68.     FIFOListItem* pTemp;
    69.     LPVOID pTmp;
    70.     pTmp = new char[szSize];
    71.     pTemp = (FIFOListItem*)pTmp;
    72.     pTemp->pPrevious = pLastItem;
    73.     pTemp->pNext     = NULL;
    74.     pTemp->cbSize    = szDataSize;
    75.     return pTemp;
    76. }
    77.  
    78. void FIFOList::DeleteItem(LPVOID pItem){
    79.     delete[] pItem;
    80. }
    81.  
    82. int main(){
    83.     FIFOList list;
    84.     int a, b;
    85.     std::cin >> a >> b;
    86.     list.Initalize(sizeof(int));
    87.     list.PushItem(&a);
    88.     list.PushItem(&b);
    89.     list.PopItem(&a);
    90.     std::cout << a;
    91.     return 0;
    92. }
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Нет, это порча кучи.
     
  11. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    он корявый, но думаю основа реализуется правильно, остальное я сам доделаю как с этой ошибкой разберусь... так что не ругайте))
     
  12. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    ну пишет он что порча, но указатель я проверил - ссылается на то что нужно! т.е порча вряд ли..
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Честно скажу, код - говнокод каких поискать мало.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Всё переписать по-нормальному и точка. Смотреть такие извраты не для слабонервных.
     
  15. mixkorshun

    mixkorshun New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    22
    нафига переписывать тестовый проект?! он нужен чтобы на основе него написать потом нужный мне список - вот его уже можно нормально писать - а этот на скорую руку.. но несмотря на это он работает и выводит ответ правильно, единственная ошибка в функции удаления
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    mixkorshun
    Вы понимаете как работает удаление объектов в C++? Это не тестовый код, страшный сон. Я такого ещё никогда не видел. Оправдания, что оно работает не принимаются. Отлавливать баги в этом будете бесконечно.