подскажите как в c++ удалить блок данных: указатель(LPVOID void*), размер cbSize Код (Text): void FIFOList::DeleteItem(LPVOID pItem){ delete pItem; } Код (Text): void FIFOList::DeleteItem(LPVOID pItem){ char* pTemp; pTemp = (char*)pItem; delete[szSize] pTemp; } эти варианты у меня не прошли (первый то ясно, а второй доработать вроде как недолго уже, наверно..)
выделял Код (Text): pTmp = new char[sbSize]; прям из проги скопировал, т.е я выделял память для массива char длины sbSize что эквивалент cbSize byte. Дальше половина уходит в структуру листа, а остальное под данные.
Код (Text): #include <windows.h> #include <iostream> //List item struct struct FIFOListItem{ struct FIFOListItem *pNext, *pPrevious; int cbSize; }; class FIFOList{ public: void Initalize(int DataSize); ~FIFOList(); bool PushItem(LPVOID pData); void PopItem(LPVOID pData); private: FIFOListItem* CreateItem(void); void DeleteItem(LPVOID pItem); int szSize; int szDataSize; FIFOListItem* pFirstItem; FIFOListItem* pLastItem; }; void FIFOList::Initalize(int DataSize){ szDataSize = DataSize; szSize = sizeof(FIFOListItem) + sizeof(DataSize); pFirstItem = new FIFOListItem; pFirstItem->pPrevious = NULL; pFirstItem->pNext = NULL; pFirstItem->cbSize = 0;//FIFOList::cbDataSize, but this's null item(start item), which has point of next items pLastItem = pFirstItem; } FIFOList::~FIFOList(){ while (pLastItem != pFirstItem){ delete pLastItem; } delete[12] pFirstItem; } bool FIFOList::PushItem(LPVOID pData){ FIFOListItem *pTemp;//, *pTemp1; pTemp = CreateItem(); if(pTemp != NULL){ memcpy((pTemp+sizeof(FIFOListItem)), pData, szDataSize);//add data of item pLastItem->pNext = pTemp; pTemp->pPrevious = pLastItem; pLastItem = pTemp; return true; } else { return false; } } void FIFOList::PopItem(LPVOID pData){ LPVOID pTemp; pTemp = pLastItem; memcpy(pData, (pLastItem + sizeof(FIFOListItem)), szDataSize); pLastItem = pLastItem->pPrevious; pLastItem->pNext = NULL; DeleteItem(pTemp); } FIFOListItem* FIFOList::CreateItem(){ FIFOListItem* pTemp; LPVOID pTmp; pTmp = new char[szSize]; pTemp = (FIFOListItem*)pTmp; pTemp->pPrevious = pLastItem; pTemp->pNext = NULL; pTemp->cbSize = szDataSize; return pTemp; } void FIFOList::DeleteItem(LPVOID pItem){ delete[] pItem; } int main(){ FIFOList list; int a, b; std::cin >> a >> b; list.Initalize(sizeof(int)); list.PushItem(&a); list.PushItem(&b); list.PopItem(&a); std::cout << a; return 0; }
он корявый, но думаю основа реализуется правильно, остальное я сам доделаю как с этой ошибкой разберусь... так что не ругайте))
нафига переписывать тестовый проект?! он нужен чтобы на основе него написать потом нужный мне список - вот его уже можно нормально писать - а этот на скорую руку.. но несмотря на это он работает и выводит ответ правильно, единственная ошибка в функции удаления
mixkorshun Вы понимаете как работает удаление объектов в C++? Это не тестовый код, страшный сон. Я такого ещё никогда не видел. Оправдания, что оно работает не принимаются. Отлавливать баги в этом будете бесконечно.