C++:从另一个 vector 指向对象的指针 vector

标签 c++ pointers c++11 vector connected-components

我有两个类,类似于:

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对象作为指针存储在那个指针 vector 中。此外,这些 A 对象中的每一个都获得指向它们所属的 B 对象的指针。对于上下文,我基本上是在使用游程编码(用于图像分割)进行连通分量算法,其中 A 类是线段,B 类是图像中的最终对象。

因此,B 类中 vector 的指针都指向存储在常规 vector 中的对象。当常规 vector 超出范围时,应该删除这些对象,对吗?我读过 B 类中的指针 vector 通常需要编写手动析构函数,但我认为这里不应该是这种情况......

我问的原因当然是因为我的代码总是崩溃。我正在使用 Asus Xtion Pro 相机获取图像,然后对每张图像执行算法。奇怪的是,每当我用力摇动相机时,程序就会崩溃。当相机静止或仅移动一点点或缓慢移动时,什么也不会发生。此外,当我使用不同的算法(也连接组件,但没有运行长度编码并且也不使用指针)时,无论我如何摇动相机,都不会崩溃。此外,在 Debug模式下(运行速度比 Release模式慢得多),也没有崩溃。

我尝试为 B 类中的指针 vector 创建一个析构函数,但它导致了“ block 有效”错误,所以我猜它删除了两次。 我还尝试用 c++11 std::shared_ptr 替换每个指针,但这只会产生非常不规则的行为,并且当我摇动相机时代码仍然崩溃。

我基本上只想知道在内存泄漏和指针处理方面,上面显示的代码是否正常,或者代码中是否存在可能导致崩溃的错误。

编辑(已解决):解决方案(参见已接受的答案)是确保 vector “listOfB”在运行时不会调整大小,例如通过使用“reserve()” ' 为它预留足够的空间。这样做之后,一切正常!显然它起作用了,因为如果 vector “listOfB”被调整大小(通过 push_back()),其中 B 实例的内部内存地址也会改变,导致 A 实例中的指针(指向 B 实例)到现在指向错误的地址 - 从而导致故障,从而导致崩溃。

关于相机晃动,显然,晃动相机会导致图片非常模糊,需要分割的元素很多,从而增加了对象的数量(即导致 listOfB 需要更大的尺寸)。于是,谜底揭晓!多谢! :-)

最佳答案

我认为设计有问题。 listofB 将增长(你执行 push_backs)并重新分配其内部数据数组,使存储在 A 实例的指针中的所有地址无效。通常的算法会将数据大小增加 2 倍,这可以解释如果没有太多数据到达,您可以暂时使用。此外,只要旧数据的内存仍在程序的地址空间中(特别是如果它在同一内存页上,例如因为新数据也适合它),程序可能不会崩溃访问它并只检索旧数据。

更具建设性的说明:如果您提前知道最大元素,您的解决方案就会奏效,这可能很难(假设您明年会得到一台 4k 相机 ;-))。顺便说一句,在那种情况下,您可以只采用一个简单的静态数组。

也许您还可以使用 std::map 来存储 A 对象,而不是使用简单的 vector listofA。每个 A 对象都需要某种类型的唯一 ID(在最简单的情况下,A 中的静态计数器)用作映射中的键。 Bs 将存储 key ,而不是 As 的地址。

关于C++:从另一个 vector 指向对象的指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35225343/

相关文章:

const 指针契约(Contract)只是热空气?

c++ - 在没有 root 的情况下安装 GCC-4.9 - 添加路径和二进制文件等等

c++ - 是否有 C++ 库来创建强大的枚举?

c++ - SFINAE decltype 逗号运算符技巧

c++ - 将 ostringstream 的整数输出为二进制?

c++ - 关于对象大小的 `static_assert` 的更好消息

编译错误 'undeclared identifier'C

c++ - 在 lldb 中使用匿名枚举作为函数参数时出错

c - 为什么这个指针交换在字符串反转中会失败?

c++ - std::basic_string 中的 push_back() 与序列容器