C ++: назначение пустого объекта существующему объекту - PullRequest
0 голосов
/ 15 марта 2019

РЕДАКТИРОВАТЬ: исправлен код для устранения путаницы

Как видно из названия, мне интересно, что происходит с объектом, когда я назначаю ему пустой объект.

Вот конкретный пример только с перегрузками операторов и членами данных классов:

class triangle
{
  vector3d p[3];
  vector2d *uv = nullptr;
 int nChannels = 0;
 public:
void operator=(const triangle &obj)
{
  delete[] uv;
  nChannels= obj.nChannels;
  memcpy(p, obj.p, sizeof(vec3d) * 3);
  uv = new vec2d[3 * obj.nChannels];
  memcpy(uv, obj.uv, 3 * obj.nChannels * sizeof(vec2d));

}

}

int main()
{
 triangle p;
 d = p; // where d is some initialized or uninitialized instance of triangle
 d = p;
}

Короче говоря, что происходит, когда я назначаю объект, у которого есть один элемент, который не был инициализирован, другому объекту и что происходит, когда я вызываю новый треугольник [0], я ожидаю, когда я вызываю новый треугольник [0] для получить nullptr, но я больше не уверен в этом.

1 Ответ

1 голос
/ 15 марта 2019

что происходит, когда я назначаю объект, у которого есть один элемент, который не был инициализирован

Будет вызван оператор присваивания. В этом случае вы указали пользовательский оператор присваивания.

Предоставленный оператор (как неявно сгенерированный) считывает состояние правого операнда, который в этом случае инициализируется по умолчанию. p не имеет инициализатора, поэтому неявный конструктор по умолчанию оставляет его с неопределенным значением. Поведение чтения неопределенного значения не определено.

То есть, если программа может быть скомпилирована в первую очередь. Он использует незадекларированные идентификаторы и плохо сформирован.

и что происходит, когда я звоню new triangle[0]

Будет создан массив длины 0.

ожидал бы, когда я вызову новый треугольник [0], чтобы получить nullptr

Ваши ожидания ошибочны. Результирующий указатель будет ненулевым (если вы не использовали std::nothrow и выделение не удалось). Обращение через этот указатель будет иметь неопределенное поведение. Программа утечет память, если выделение не будет освобождено с delete[].

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