我有两个类,类似于:
class A
{
public:
B* ptr1;
}
class B
{
public:
std::vector<A*> list;
}
在主要实现中,我正在做这样的事情:
int main() {
// there are a lot more A objects than B objects, i.e. listOfA.size() >>> listOfB.size()
std::vector<A> listOfA;
std::vector<B> listOfB;
while (//some loop)
{
listOfB[jj].list.push_back( &(listofA[ii]) );
listOfA[ii].ptr1 = &( listOfB[jj] );
}
} // int main end
基本上是这样的。许多A对象被分配给一个B对象,这些A对象作为指针存储在那个指针向量中。此外,每个 A 对象都有一个指向它们所属的 B 对象的指针。对于上下文,我基本上是在使用运行长度编码(用于图像分割)进行连接组件算法,其中 A 类是线段,B 类是图像中的最终对象。
因此,B 类中向量的指针都指向存储在常规向量中的对象。当常规向量超出范围时,应该删除这些对象,对吗?我读过 B 类中的指针向量通常需要编写手动析构函数,但我认为这里不应该是这种情况......
我问的原因当然是因为我的代码不断崩溃。我正在使用华硕 Xtion Pro 相机获取图像,然后对每张图像执行算法。奇怪的是,每当我用力摇晃相机时,程序就会崩溃。当相机静止或仅移动一点点或缓慢移动时,什么也不会发生。此外,当我使用不同的算法(也连接组件,但没有运行长度编码并且也不使用指针)时,无论我如何摇晃相机,都不会崩溃。此外,在调试模式下(运行速度比发布模式慢得多),也没有任何崩溃。
我尝试为 B 类中的指针向量创建一个析构函数,但它导致了“块有效”错误,所以我猜它删除了两次。我还尝试用 c++11 std::shared_ptr 替换每个指针,但这只会产生非常不规则的行为,并且当我摇晃相机时代码仍然崩溃。
我基本上只是想知道在内存泄漏和指针处理方面,上面显示的代码是否正常,或者代码中是否存在可能导致崩溃的错误。
编辑(已解决):解决方案(参见接受的答案)是确保向量“listOfB”在运行时不会调整大小,例如使用“reserve()”为其保留足够的空间。完成此操作后,一切正常!显然它起作用了,因为如果向量'listOfB'被调整大小(通过push_back()),其中B实例的内部内存地址也会改变,导致A实例中的指针(指向B实例)到现在指向错误的地址 - 从而导致麻烦,从而导致崩溃。
关于相机抖动,显然,抖动相机会导致图片非常模糊,需要分割的元素很多,从而增加了对象的数量(即导致 listOfB 需要更大的大小)。于是,谜团解开了!非常感谢!:-)