C ++:将空对象分配给现有对象

问题描述 投票:-3回答:1

编辑:修复代码以消除一些混乱

正如标题所说,当我为其分配一个空对象时,我想知道对象会发生什么。

这是一个只有运算符重载和类数据成员的具体示例:

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但我不再那么肯定了。

c++ object
1个回答
1
投票

当我分配一个有一个尚未初始化的成员的对象时会发生什么

将调用赋值运算符。在这种情况下,您提供了一个用户声明的赋值运算符。

提供的运算符(如隐式生成的运算符)读取右侧操作数的状态,在这种情况下默认初始化。 p缺少初始化器,因此隐式默认构造函数使其具有不确定的值。读取不确定值的行为未定义。

也就是说,如果程序可以首先编译。它使用未声明的标识符,并且格式错误。

当我打电话给new triangle[0]时会发生什么

将创建长度为0的数组。

当我将新三角形[0]称为nullptr时,我会期待

你的期望是错误的。结果指针将为非null(除非您使用std::nothrow并且分配失败)。通过该指针指向将具有未定义的行为。除非使用delete[]发布分配,否则该程序将泄漏内存。

© www.soinside.com 2019 - 2024. All rights reserved.