функция-член класса завершается ошибкой, когда как минимум два экземпляра класса объявлены ранее - PullRequest
0 голосов
/ 22 мая 2011

У меня есть два класса, BTLeafNode и BTNonLeafNode, каждый из которых является производным от моего класса BTreeNode. BTreeNode имеет защищенный буфер данных, который представляет собой массив символов размером 1024 байта. BTreeNode имеет шаблонную функцию inserttemp, которая хранит пары int-T в буфере, где T - тип, с которым вызывается функция. Каждый класс имеет свою собственную функцию вставки, которая вызывает inserttemp. BTNonLeafNode хранит пары int-PageId (PageId в основном int), а BTLeafNode сохраняет пары int-RecordId (Record Id состоит из PageId и int) в буфер. Я еще не тестировал BTNonLeafNode, но по какой-то причине, когда у меня есть только два экземпляра BTLeafNode, и я вызываю функцию вставки, он работает нормально, но для любого экземпляра BTLeafNode, который был объявлен после того, как было объявлено как минимум два экземпляра BTLeafNode, это облажается. Часть памяти, которая должна хранить int в RecordId, вместо этого хранит int следующей пары int-RecordId (эти две части данных хранятся рядом друг с другом в буфере).

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

1 Ответ

0 голосов
/ 22 мая 2011

На данный момент код не опубликован, поэтому мы не можем точно увидеть, что происходит, но если вы не объявили какой-либо элемент данных как статический элемент данных, и каждому производному экземпляру BTreeNode принадлежитэто собственный закрытый буфер, поэтому я могу в значительной степени гарантировать, что проблема не имеет ничего общего с наследованием или количеством экземпляров производного объекта, который вы объявляете, но, скорее всего, это проблема вашего алгоритма вставки.Это может быть небольшая ошибка, которая не проявляется в каждом случае, следовательно, причина, по которой некоторые вставки работают, но опять же, поскольку каждый объект экземпляра имеет свой собственный буфер памяти, то единственный способ, которым объект экземпляра мог иметь его буфер в памятиup, если у алгоритма в функции-члене, которая обращается к массиву объекта экземпляра, есть проблема.

Также вы сказали, что в каждом экземпляре BTreeNode есть массив символов по 1024 байта, но вы 'сохраняя пары с помощью функции шаблона ... вы делаете какой-то тип приведения пары к unsigned char* и используете memcpy() для выделения структуры пары в буфере?Если да, то многое может пойти не так, если вы не будете внимательны к тому, как увеличивать и разыгрывать указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...