В чем проблема с перегрузкой оператора присваивания? - PullRequest
2 голосов
/ 21 июня 2010

Моя программа аварийно завершает работу, когда пытается присвоить один объект другому. Видите ли вы что-нибудь не так с этим?

Переменные:

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 ]

1 голос
/ 21 июня 2010

Одной из проблем может быть то, что scr.numOfFields превышает количество полей в целевом объекте.

Другая проблема заключается в том, что, по крайней мере, кажется, вы назначаете указатели для вашего нового объекта.Это означает, что у вас будет ссылка на одно и то же место дважды в программе.Что произойдет, если оно будет удалено в одном месте, а другое не узнает об этом?Когда вы пытаетесь получить доступ к памяти, вы получаете ошибку сегмента.

Если у вас есть Boost, вы можете использовать их общие указатели, чтобы избежать этого: http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm

0 голосов
/ 21 июня 2010

Вы должны использовать 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::vector и boost::shared_ptr, вместо этого выполнение этого поможет предотвратить возникновение подобных проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...