Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在之前声明了至少两个类实例时,类成员函数失败_C++_Inheritance - Fatal编程技术网

C++ 在之前声明了至少两个类实例时,类成员函数失败

C++ 在之前声明了至少两个类实例时,类成员函数失败,c++,inheritance,C++,Inheritance,我有两个类,BTLeafNode和BTNonLeafNode,每个类都是从我的类BTreeNode派生的。BTreeNode有一个受保护的数据成员缓冲区,它是一个1024字节字符数组。BTreeNode有一个模板函数inserttemp,它在缓冲区中存储int-T对,其中T是调用该函数的类型。每个类都有自己的函数insert,该函数调用inserttemp。BTNonLeafNode存储int PageId对PageId基本上是一个int,BTLeafNode存储int RecordId对记录I

我有两个类,BTLeafNode和BTNonLeafNode,每个类都是从我的类BTreeNode派生的。BTreeNode有一个受保护的数据成员缓冲区,它是一个1024字节字符数组。BTreeNode有一个模板函数inserttemp,它在缓冲区中存储int-T对,其中T是调用该函数的类型。每个类都有自己的函数insert,该函数调用inserttemp。BTNonLeafNode存储int PageId对PageId基本上是一个int,BTLeafNode存储int RecordId对记录Id包含一个PageId和一个int到缓冲区中。我还没有测试BTNonLeafNode,但由于某种原因,当我只有两个BTLeafNode实例时,我调用了insert函数,它工作得很好,但是对于在至少声明了两个BTLeafNode实例之后声明的任何BTLeafNode实例,它都会出错。内存中应该将int存储在RecordId中的部分将存储下一个int-RecordId对的int。这两个数据段彼此相邻地存储在缓冲区中


我真的很困惑,因为我不明白为什么声明一个实例会破坏函数。没有任何全局变量。您甚至不需要对已声明的实例执行任何操作,只要您声明它们,就会弄乱函数。

此时没有发布任何代码,因此我们无法确切了解发生了什么,但是如果您没有将任何数据成员声明为静态数据成员,并且BTreeNode的每个派生实例都拥有自己的专用缓冲区,然后我可以很好地保证问题与继承无关,也与您声明的派生对象的实例数无关,但很可能是插入算法的问题。这可能是一个微妙的缺陷,并非在所有情况下都会出现,因此某些插入都会起作用,但同样,由于每个实例对象都有自己的内存缓冲区,那么,实例对象的内存缓冲区出错的唯一方法就是访问实例对象数组的成员函数中的算法出现问题


您还说过在BTreeNode的每个实例中都有一个1024字节的字符数组,但您正在使用模板函数存储对。。。您是否正在对未签名字符*执行某种类型的对转换,并使用memcpy在缓冲区中分配对结构?如果您是,那么如果您不小心如何递增和强制转换指针,可能会出现很多错误。

发布复制这种行为的最少代码会很有帮助。很难说没有看到你在做什么。我怀疑插入太像其他人评论。似乎存在缓冲区溢出。如果您使用的是MS visual studio,那么也可以使用“/GS”标志“/GZ”来检查缓冲区溢出。它会在缓冲区溢出时抛出异常,您可以检查callstack。我不做任何转换,但我使用memcpy将对存储到缓冲区中。但我认为这95%与声明两个以上的实例有关。我已经试过很多次了。我可以运行一段代码,该代码可以很好地处理到实例,然后除了在所有操作之前添加一个实例之外,什么都不做更改,最后一个实例停止正常工作。缓冲区是否共享,即静态??根据你的描述,你说没有全局变量,所以我认为不是。