我有一个奇怪的行为与对象分配。如果你能解释为什么这项任务能像这样工作,我将非常感激。这花了我很多时间。 我正在使用Visual Studio Enterprise 2017(所有默认设置)。奇怪的对象分配行为C++
代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
cout << "Constructor of " << this << endl;
}
~Test()
{
cout << "Destructor of " << this << endl;
}
};
int main()
{
cout << "Assignment 1" << endl;
auto t = Test();
cout << "Assignment 2" << endl;
t = Test();
int i = 0;
cin >> i;
return 0;
}
输出(最高CIN):
Assignment 1
Constructor of 006FFC9F
Assignment 2
Constructor of 006FFBC7
Destructor of 006FFBC7
的预期输出(最高CIN):
Assignment 1
Constructor of 006FFC9F
Assignment 2
Destructor of 006FFC9F
Constructor of 006FFBC7
我想写一个测试功能,创建我的(模板)类的对象,做一些测试,然后创建一个新对象并做更多的测试。问题在于t在第二次赋值后保存已经被破坏的对象。 我知道我只能使用导致预期行为的动态分配,但为什么这个程序的行为不同?
非常感谢。 此致敬礼。
PS:结果是相同的,独立的推出/调试或64/32位编译的
编辑:更详细的例如:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Test
{
private:
float* val;
public:
Test()
{
val = new float;
cout << "Constructor of " << this << ", addr. of val: " << val << endl;
}
~Test()
{
cout << "Destructor of " << this << ", addr. of val: " << val << " --> DELETING VAL!" << endl;
delete val;
}
float* getVal() { return this->val; }
};
int main()
{
cout << "Assignment 1" << endl;
auto t = Test();
cout << "Assignment 2" << endl;
t = Test();
cout << "Val Address: " << t.getVal() << endl;
int i = 0;
cin >> i;
return 0;
}
输出(它保持在一个已删除的指针结束!!!):
Assignment 1
Constructor of 004FFBDC, addr. of val: 0072AEB0
Assignment 2
Constructor of 004FFB04, addr. of val: 00723928
Destructor of 004FFB04, addr. of val: 00723928 --> DELETING VAL!
Val Address: 00723928
看一看复制椭圆,自C++ 17以来必须在某些情况下执行。 –
'auto t = Test();'不是一个赋值,而是一个初始化。 – Jarod42
在't = Test();'你构造一个Test的临时对象,把它传递给't'的'operator =',然后销毁这个临时对象。你为什么认为这是一个问题?如果你把print语句放在'operator ='中(为了完整起见,也许是copy-constructor),你会清楚地看到这种行为。 –