Witajcie,
Debuguje program metodą jakiegoś jaskiniowca. (na Linux chyba nie ma dobrego debuggera, w Win to MSVC ma dobry). Czy w tej funkcji znajduje się błąd? Nie składniowy tylko działania. Kompiluje sie bez problemu tylko program rzuca mi błędami pamięci, teraz akurat takim *** Error in './bearchhost': double free or corruption (fasttop): 0x00000000009e75d0 *** Przerwane (zrzut pamięci)
wcześniej był access violation
, ale go znalazłem. Oto funkcja:
void Node::addChild(Node* child)
{
/* OBJASNIENIE, PROSZĘ PRZECZYTAĆ...
* header->itemChildrens = 0
* childrens = new Node[0];
* child to utworzona i uzupełniona wcześniej dynamicznie zaalokowana klasa.
* Po wywolaniu tej funkcji to child jest juz usuwane
*/
Node* tempChildrens = new Node[header->itemChildrens + 1];
std::memcpy(tempChildrens, childrens, header->itemChildrens*sizeof(Node));
delete [] childrens;
childrens = tempChildrens;
childrens[header->itemChildrens] = *child;
++header->itemChildrens;
sort();
}
Oto klasa Node:
class Node {
//private:
public:
FileHeader* header;
Node* childrens;
Node* parent;
static int compareNodes(Node* a, Node* b);
public:
Node();
~Node();
void addChild(Node* child);
...
void sort();
...
};
PS. Dodam może, że nadrzędną funkcją jest to:
Error Archive::mkDir(FilePath const& dirName)
{
FileChildrenNum result = 0;
Error err = actualNode->findChild(dirName, result);
if(err == NOT_FOUND)
{
Node* tempNode = new Node();
FileHeader* tempNodeHeader = 0;
tempNode->getHeader() = tempNodeHeader = new FileHeader;
std::memset(tempNodeHeader->itemName, 0, FileMaxName);
std::strcpy(tempNodeHeader->itemName, dirName.c_str());
tempNodeHeader->itemChildren = 0;
tempNodeHeader->itemType = DIRECTORY;
tempNodeHeader->dataFirst = 0;
tempNodeHeader->dataLength = 0;
actualNode->addChild(tempNode);
delete tempNode;
}
else if(err == INVALID_PATH)
return err;
else if(err == IS_OK)
return FILE_ALREADY_EXISTS;
else
return UNDEFINED_BEHAVIOR;
return IS_OK;
}
Problem nie powstaje przy pierwszym wywołaniu mkDir tylko przy podwójnym wywołaniu tej funkcji (niezależnie od parametrów). Error w Linuxie to właśnie ten *** Error in './bearchhost': double free or corruption (fasttop): 0x00000000009e75d0 *** Przerwane (zrzut pamięci)
wcześniej był access violation
. Sprawdziłem wszystkie delete wywoływane przy funkcji i nie widze żadnych podwójnych.