2011-05-22 74 views
0

我有兩個類,BTLeafNode和BTNonLeafNode,其中每一個派生自我的類BTreeNode。 BTreeNode有一個受保護的數據成員緩衝區,它是一個1024字節的字符數組。 BTreeNode有一個模板函數inserttemp,它在緩衝區中存儲int-T對,其中T是調用該函數的類型。每個類都有自己的調用inserttemp的函數插入。 BTNonLeafNode存儲int-PageId對(PageId基本上是一個int),BTLeafNode將int-RecordId對(記錄Id由PageId和一個int組成)存儲到緩衝區中。我還沒有測試BTNonLeafNode,但由於某種原因,當我只有兩個BTLeafNode實例,並且我調用插入函數時它工作正常,但對於在宣告至少兩個BTLeafNode實例後聲明的任何BTLeafNode實例,它擰緊了。應該在RecordId中存儲int的內存部分將存儲下一個int-RecordId對的整數(這兩部分數據在緩衝區中彼此相鄰存儲)。類成員函數失敗時,至少有兩個類聲明之前

我真的很困惑,因爲我不明白爲什麼聲明一個實例會弄亂函數。沒有任何全局變量。您甚至不需要對已聲明的實例進行任何操作,只要您聲明它會使函數失效即可。

+6

發佈將重現此行爲的最小代碼會很有幫助。沒有看到你在做什麼很難說。 – 2011-05-22 04:40:23

+0

我也懷疑其他評論者的插入方式。似乎有一個緩衝區溢出。如果您使用MS visual studio,請使用'/ GS'標誌(也可能是'/ GZ')來檢查緩衝區溢出。它會拋出緩衝區溢出異常,你可以檢查調用堆棧 – hackworks 2011-05-22 05:03:54

回答

0

此時沒有發佈代碼,所以我們不能確切地看到發生了什麼,但是如果您沒有將任何數據成員聲明爲靜態數據成員,並且每個衍生的BTreeNode實例擁有它自己的私有緩衝區,那麼我幾乎可以保證這個問題與繼承無關,或者你聲明的派生對象有多少個實例,但是很可能是插入算法的一個問題。它可能是一個微妙的錯誤,它並不是每一種情況都出現,因此一些插入工作的原因,但是由於每個實例對象都有它自己的內存緩衝區,所以實例對象可能會讓它的內存緩衝區被擰緊up是如果訪問實例對象數組的成員函數中的算法存在問題。

另外你說在每個BTreeNode的實例中都有一個1024字節的字符數組,但是你使用模板函數來存儲對...你是否正在對unsigned char*進行一些類型的轉換,並使用memcpy()在緩衝區中分配對結構?如果你是,那麼如果你不小心如何增加和投射你的指針,就會出現很多錯誤。

+0

我不做任何轉換,但我使用memcpy()將這些對存儲到緩衝區中。但我95%,它必須做聲明兩個以上的實例。我測試了一堆。我可以運行一段可以正常工作的代碼,然後在沒有任何事情前添加一個實例並且最後一個實例停止正常工作。 – mike 2011-05-22 05:11:07

+0

是否共享緩衝區(即「靜態」)?從你的描述你說沒有全局的,所以我會認爲它不是。 – Jason 2011-05-22 15:11:12