C ++复制分配问题

时间:2010-07-22 13:32:21

标签: c++ copy segmentation-fault variable-assignment

我似乎遇到了以下功能的问题:

void OtherClass::copy_this( int index, MyClass &class_obj)
{
    if(index < MAX_index)
        class_obj = array_of_MyClass[index];
}

OtherClass维护一个MyClass对象数组,我希望这个函数将一个选定的对象从数组中复制到提供的class_obj中。

当我运行时,程序在达到此功能时会出现分段错误。在gdb中运行它并查看回溯显示当它到达赋值行时,执行将向后向后跳几乎100行到一个完全不同的函数的中间。它跳转到的行是:

temp_obj = array_of_MyClass[other_index]

gdb回溯的相关输出是:

#0  0x0000003c7ae7256c in memcpy () from /lib64/tls/libc.so.6
#1  0x000000000043264e in MyClass::operator= (this=0x4c0000004c, _ctor_arg=@0x7fbffd8228) at ../location.cpp:156
#2  0x0000000000432569 in OtherClass::copy_this (this=0x7fbffd8220, index=0, section=@0x4c0000004c) at ../location.cpp:254

显然它是同一类型的操作,但为什么地球上的执行会像那样移动?我在节目的任何地方都没有长跑,傻瓜等。我也没有用户定义的赋值运算符,复制构造函数等,所以来自回溯的“operator =”令人费解。

在有人要求之前,不,我无法发布整个代码。 (对不起!)我意识到这可能使我无法确定我的问题;如果是这种情况,请告诉我。

提前致谢!


在再次运行并测试了几个“最简单的用法”案例之后,似乎问题实际上是在执行早期的某个地方引入的,所以它又回到了绘图板上。谢谢大家的帮助!

5 个答案:

答案 0 :(得分:0)

索引是否有效?我看到你与MAX_index比较,但你的数组是否包含MAX_index,初始化元素?我问,因为,如果你复制了一个无效的对象,你就会有你所描述的未定义(令人不愉快)的行为。

另一种可能性(如果不是这个)是完成重建的时候了。调试信息已损坏,或生成的代码不完整(由于构建过程中的任何原因)。

答案 1 :(得分:0)

代码是用优化器标志编译的吗?优化器可以对执行流程执行非常奇怪的操作,包括从一个函数跳转到一个完全不相关的函数,该函数恰好具有执行第一个函数所需的代码片段。

答案 2 :(得分:0)

你说执行向后跳跃的行是对MyClass类对象的赋值。这就是您在回溯中看到MyClass::operator=的原因。 你说你没有用户定义的赋值运算符或复制构造函数,所以这将解释它在回溯中的memcpy(),因为这是复制的默认实现(浅拷贝。)

在这种情况下,我认为实现复制构造函数(对于Myclass)可能会有所帮助。

关于segfault本身 - 数组是如何初始化的?数组的索引0是什么? (似乎已在电话中使用过)

答案 3 :(得分:0)

你没有它们,但是无论如何编译器都会生成它们,这就是你在使用=运算符时调用的。最有可能的是默认赋值运算符不足以支持MyClass,这就是它无效的原因。明确地实现它们,看看这是否解决了这个问题。

如果没有更多的源代码,可以推荐更多。

答案 4 :(得分:0)