我对对象分配有一种奇怪的行为。如果你能解释为什么这个作业是这样的,我将不胜感激。它已经花费了我很多时间。 我正在使用 Visual Studio Enterprise 2017(所有默认设置)。
代码:
#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:不管是Release/Debug还是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
最佳答案
与
auto t = Test();
您实际上构建了两个 对象。首先是构造临时对象的 Test()
。第二种是 t
的构造,它是通过复制构造 实现的。这里没有赋值,即使使用了=
操作符也是拷贝构造。
如果您向 Test
类添加一个复制构造函数,类似于您的构造函数和析构函数,您应该看得很清楚。
至于
t = Test();
此处使用Test()
创建了一个临时 对象。然后将该临时对象传递给 Test
类的(编译器生成的)赋值运算符,然后立即销毁该临时对象。
对象 t
本身没有被破坏,它不应该被破坏,因为它是赋值的目的地。
关于c++ - 奇怪的对象分配行为 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44395074/