c++ - 奇怪的对象分配行为 c++

标签 c++ class constructor visual-studio-2017 destructor

我对对象分配有一种奇怪的行为。如果你能解释为什么这个作业是这样的,我将不胜感激。它已经花费了我很多时间。 我正在使用 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/

相关文章:

class - Puppet:命名空间如何与虚拟资源、类和定义一起工作?

java - 在构造函数中,找到哪个类创建了对象?

javascript - 如何从构造函数中调用方法

c++ - C++中的构造函数参数太多

ruby - 认为 ruby​​ 中缺少方法是否可疑?

c++ - 调整对齐方式的 Typedef

C++ 将 Boost Regex 匹配结果转换为其他格式

C++ 异常重新抛出省略号

c++ - 尝试使用宽字符串创建类时出现访问冲突

c++ - 如何在其他计算机上部署用visual studio编写的简单boost程序