这个赋值运算符重载会带来什么问题

时间:2010-06-21 00:27:25

标签: c++ operator-overloading

当我的程序试图将一个对象分配给另一个时,我的程序崩溃了,你这个人看到了什么问题吗?

变量是:

Field *fields[50];
int numOfFields;
int currentField;

功能是:

Screen& operator=(Screen &scr) {
  if (this != &scr){
    for (int i = 0; i < 50; i++)
      fields[i] = NULL;

    for (int i = 0; i < scr.numOfFields; i++) 
      fields[i] = scr.fields[i];

    numOfFields = scr.numOfFields;
    currentField = scr.currentField;
   }

  return *this;
}

2 个答案:

答案 0 :(得分:1)

一个问题可能是scr.numOfFields超出了目标对象中的字段数。

另一个问题是,或者至少看起来,你正在为新对象分配指针。这意味着您将在程序中两次引用相同的位置。如果它在一个地方被删除而另一个不知道它会发生什么?当您尝试访问内存时,您将遇到seg错误。

如果你有Boost,你可以使用他们的共享指针来帮助避免这种情况:http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm

答案 1 :(得分:0)

您应该使用std::vector代替动态数组,我怀疑您的问题会很快消失。

根据MadCap的建议,您还应该使用共享指针,因为这是使用指针与容器时的最佳做法。这也将为您提供您期望的复制语义。

这将否定对此的需求:

    for (int i = 0; i < 50; i++)
        fields[i] = NULL;

你可以替换它:

   for (int i = 0; i < scr.numOfFields; i++) 
        fields[i] = scr.fields[i];

使用std :: copy,类似于:

fields.clear()
std::copy(scr.fields.begin(), scr.fields.end(), fields.begin());

通过执行此操作,您将消除由于某些指针访问或初始化错误而发生崩溃的可能性。

简单的建议是;停止使用动态数组和原始指针并开始使用std::vectorboost::shared_ptr,而这样做有助于防止遇到这些问题。