2017-08-16 32 views
-1

我有以下关于一个问题的代码片段。在C++中重建对象并将其分配给相同类型

V v(10,0);//first argument is size and the second is init val for each element 
... 
v = V(5,0); 

是否当我打电话V(5,0),并在第二行分配到v先前分配v得到自动销毁?类型V的新对象是否已创建并分配给v?我不完全了解幕后发生的事情。

+1

听起来像是时候阅读[赋值操作符](http://en.cppreference.com/w/cpp/language/operator_assignment)。 – tadman

回答

3
V v(10,0); 

编译器将分配在调用堆栈(未堆)的一些空间,然后调用V(int,int)构造,在内存中的地方,来构造对象。

v = V(5,0); 

这实际上是几个部分,我将分开:

....V(5,0). 

还是那句话:编译器将分配的调用堆栈(不是堆)一些空间,然后在调用V(int,int)构造那个放在内存中的地方,来构建临时的未命名对象。

v = ....... 

编译器调用v.operator=(const V&)构件,这大概从参数(无名V临时)的内容复制到命名v对象。

..........; 

表达结束,所以编译器调用析构函数~V摧毁临时对象,然后(可能)后重新分配的调用堆栈进行再利用的空间。

当范围结束时(通常:函数结束时),编译器会自动调用~V析构函数销毁指定的v对象,然后释放callstack上的空间。

+0

'operator =(const V&)'是编译器生成的这个运算符的代码吗? – marc

+0

分配给'V(10,0)'的内存空间会发生什么?这个原始对象是否会被破坏,或者我是否也需要销毁它? – marc

+0

函数结束时。添加到答案中。 –

相关问题