C++移动构造函数问题,编译优化导致不一致

在学习到拷贝够造函数的时候,死活就不是按照B站清华大学的一个C++进阶班老师说的一样,getNum为一个局部函数,里面创建的对象,在函数返回时被释放,从而调用拷贝构造函数,返回一个临时对象,用临时对象调用getInt()输出0,在主函数结束的时候,临时构造的对象会调用析构函数。
用code block运行 如图下图:
在这里插入图片描述
查阅资料,知道原来有些编译器会对代码进行优化,并不会调用构造函数,用vs2017运行了一下结果如下,果然是编译器优化问题
在这里插入图片描述

#include <iostream>
using namespace std;
class IntNum
{
public:
	IntNum(int x = 0) :xptr(new int(x))
	{
		cout << "Calling constructor.." << endl;
	}
	IntNum(const IntNum & n) :xptr(new int(*n.xptr))
	{
		cout << "Calling copy constructor..." << endl;
	}

	~IntNum()
	{
		delete xptr;
		cout << "Destructor..."<<endl;
	}
	int getInt()
	{
		return *xptr;
	}
private:
	int *xptr;
};
IntNum getNum()
{
	IntNum a;
	return a;
}
int main()
{
	cout << getNum().getInt() << endl;
	return 0;
}

当代码中增加,移动构造函数时,编译器便会自动调用移动构造函数,把n.xptr的地址给移动构造函数构建对象的指针,然后自己置为null,这样就不会释放所指向的第一个建的对象了

#include <iostream>
using namespace std;
class IntNum
{
public:
	IntNum(int x = 0) :xptr(new int(x))
	{
		cout << "Calling constructor.." << endl;
	}
	IntNum(const IntNum & n) :xptr(new int(*n.xptr))
	{
		cout << "Calling copy constructor..." << endl;
	}
	IntNum(IntNum && n) :xptr(n.xptr)
	{
		n.xptr = nullptr;
		cout << "Calling move constructor..." << endl;
	}
	~IntNum()
	{
		delete xptr;
		cout << "Destructor..."<<endl;
	}
	int getInt()
	{
		return *xptr;
	}
private:
	int *xptr;
};
IntNum getNum()
{
	IntNum a;
	return a;
}
int main()
{
	cout << getNum().getInt() << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38173631/article/details/105317200