Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Сначала убедитесь, что действительно необходимо поддерживать копию. Большую часть времени это не имеет место, и таким образом запрещающий обоих способ пойти.
Иногда, необходимо будет все еще обеспечить дублирование на классе от полиморфной иерархии в этом случае: отключите оператор присваивания, запишите (защищенный?) копируют конструктора и обеспечивают виртуальный клон () функция.
Иначе, в случае Вы пишете класс значения, Вы вернулись в землю Ортогональной Канонической формы Coplien. Если у Вас будет участник, который не может быть тривиально скопирован, то необходимо будет предоставить конструктору копии, деструктору, оператору присваивания и конструктору по умолчанию. Это правило может быть усовершенствовано, видеть, например: Закон Большого Два
я также рекомендовал бы взглянуть на C++ FAQ относительно операторов присваивания , и в идиома копии-и-подкачки и в GOTW.
Компилятор генерировал работу версий в большинстве ситуаций.
необходимо думать немного тяжелее о проблеме, когда объект содержит НЕОБРАБОТАННЫЙ указатель (аргумент в пользу того, что не имелись НЕОБРАБОТАННЫЕ указатели). Таким образом, у Вас есть НЕОБРАБОТАННЫЙ указатель, второй вопрос - Вы, владеют указателем (он удаляет Вами)? Раз так затем необходимо будет применить правило 4.
Владение больше чем 1 НЕОБРАБОТАННЫМ указателем становится все больше трудным сделать правильно (Увеличение сложности не линейно ни один [но это наблюдательно, и у меня нет реальной статистики для резервного копирования того оператора]). Таким образом, если у Вас есть больше чем 1 НЕОБРАБОТАННЫЙ указатель, думают об обертывании каждого в его собственном классе (некоторая форма интеллектуального указателя).
Правило 4: Если объект является владельцем НЕОБРАБОТАННОГО указателя затем, необходимо определить следующие 4 участников, чтобы удостовериться, что Вы обрабатываете управление памятью правильно:
, Как Вы определяете, они будут зависеть от ситуаций. Но вещи не упустить:
попытайтесь считать это.
http://www.icu-project.org/docs/papers/cpp_report/the_anatomy_of_the_assignment_operator.html
является очень хорошим анализом Оператора присваивания
Я понятия не имею об исключении безопасно здесь, но я иду этим путем. Давайте предположим, что это - шаблонная обертка массива. Надежда это помогает :)
Array(const Array& rhs)
{
mData = NULL;
mSize = rhs.size();
*this = rhs;
}
Array& operator=(const Array& rhs)
{
if(this == &rhs)
{
return *this;
}
int len = rhs.size();
delete[] mData;
mData = new T[len];
for(int i = 0; i < len; ++i)
{
mData[i] = rhs[i];
}
mSize = len;
return *this;
}