【问题标题】:What may cause losing object at the other end of a pointer in c++?什么可能导致 C++ 中指针另一端的对象丢失?
【发布时间】:2009-12-01 05:11:31
【问题描述】:

编辑:我发现了错误:我没有用大小初始化数组。问题可以结束了。


我有一个班级V,还有另一个班级NN 的对象将有一个指向V 类对象的指针数组(比如V **vList)。所以,N 有一个类似的功能 V **getList(); 现在在其他类的某些函数或只是一个驱动程序函数中,如果我说V **theList = (N)n.getList(); Q1:theList 将指向数组的第一个元素?鉴于数组的大小是已知的,我可以用索引i 循环并说V *oneV = *vList[i] 吗?如果我在上面做错了,请纠正我。


我一直在使用调试器来跟踪我的程序运行的整个过程,我发现在使用V *oneV = vList[i]之后,数组中的指针vList的值和它们之前的一样已创建,但如果我跟随指针指向它指向的位置,则该对象消失了。我猜这可能是我收到段错误或总线错误的原因。会是这样吗?为什么我“松开”指针另一端的对象?我做错了什么?


是的,我正在完成一项学校作业,这就是为什么我不想打印我的代码,我想自己完成它,但我需要帮助来找出问题。我想我仍然需要对指针数组进行解释。谢谢

【问题讨论】:

  • 您应该在 "V *oneV = *vList[i]" 之前添加另一个左引号。文字此时有点糊涂了……

标签: c++ arrays object


【解决方案1】:

Q1 是对的。对于第二部分,V *oneV = vList[i] 将是正确的语法。在您的语法中,您再次取消引用(将 V 类型的对象视为指向此类对象的指针),这显然会使您的代码崩溃。

编辑: 由于您使用的是正确的语法,因此段错误的原因将取决于您对 V 类型对象的内存管理。如果您在函数内插入了在堆栈上创建的对象的地址(自动变量,而不是 newmalloc)并试图在函数外部访问它们,那么指针将悬空并且您的代码将崩溃。

【讨论】:

  • 哎呀,这是一个错字,对不起。我是按照你说的方式写的
【解决方案2】:

类 N 必须以某种方式管理列表中的元素数量。通常的方法是创建一个返回数组中元素数量的公共函数,或者提供一个遍历所有列表元素的迭代器函数。


具有 N 个元素的数组存储在数组 [0] 到数组 [N-1] 中。您正在访问数组末尾的一个。

【讨论】:

    【解决方案3】:

    先排除最初的:

    • 您正在正确初始化(新的而不是自动/局部变量)
    • 您正在正确访问元素(不像您在问题中发布的错字 - 根据您的评论)
    • 您使用了正确的尺寸

    如果您检查了所有正常的并且一切都是 k,那么请务必特别注意您的循环/大小计算/以及任何其他可能导致您写入意外地址的内容。

    有可能在非预期的位置写入垃圾,然后在意想不到的地方得到错误......我看到的最糟糕的情况是,一些文件描述符的变量由于在这些变量之前出现错误的数组而损坏 - 它坏了关于文件相关的功能,这似乎很疯狂。

    【讨论】:

      【解决方案4】:

      theList 将指向第一个 数组的元素?鉴于 数组的大小是已知的,我可以循环 通过索引 i 并说 V *oneV = *vList[i]?

      是的,没错。

      我猜这可能是原因 为什么我会出现段故障或总线 错误。会不会是这样?

      是的,如果你有一个无效的指针并尝试取消引用它,你会得到一个段错误。

      为什么我在 指针的另一端?我做了什么 错了吗?

      如果不查看实际代码,这很难预测。最可能的原因是您没有正确填充V**,或者在将V* 指针放入V** 数组后,您正在从其他地方删除该对象。顺便说一句,我假设您使用 new 分配内存,这个假设是否正确?

      【讨论】:

      • 是的,我正在使用新的。 “知道大小”是指不只是在某些变量中?
      • 对不起,我误读了这个问题,我把它读作 Given the size of the array is NOT known...,如果你知道大小,那就没问题了。
      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      相关资源
      最近更新 更多