std::shared_ptr作为函数形参,通过值传递、引用传递的问题解答

最近应用开发项目中,使用智能指针比较多,同时也用到了一些开源的第三库,如Fast-DDS,这些软件项目中很多地方用到了智能指针,然而在偶然间看到一个关于智能指针的使用建议,提到”智能指针作为函数形参,定义函数接口时,建议使用值传递,慎用引用转递!!!“,结合看了一些开源代码的实现,并没有满足这个建议进行实现,于是做出了自己的思考,现在编译优化,以及智能指针和引用传递的特点,应该不影响智能指针引用计数的变化,及引用传递时,只是一个别名,使用前后,不改变智能指针的使用计数,从而定义函数接口时,使用值传递和引用传递都不受影响,除非使用者在接口调用前后,或者调用的接口内部,自己强行delete智能指针的空间,或者修改其使用计数。

本人也编码进行验证了,结论是:只要保证智能指针的规范使用,根据应用的业务需求,使用值传递还是引用传递均可,或者const引用传递都可以,何种方式根据自身业务场景进行设计和实现,代码实现和验证结过如下:

static void sharedPtrTest01(
	const std::shared_ptr<int> &spPtrIn
	, std::shared_ptr<int> spPtrSend
	, std::shared_ptr<int>& spPtrOut)
{
	std::cout << "sharedPtrTest01: " << spPtrIn << "\t" << spPtrIn.use_count() << std::endl;
	std::cout << "sharedPtrTest01: " << spPtrSend << "\t" << spPtrSend.use_count() << std::endl;
	std::cout << "sharedPtrTest01: " << spPtrOut << "\t" << spPtrOut.use_count() << std::endl;

	return;
}

void sharedPtrTest()
{
	std::shared_ptr<int> spPtr1(new int (1));
	std::shared_ptr<int> spPtr2(new int (2));
	std::shared_ptr<int> spPtr3(new int (3));

	std::cout << "------------------------------------" << std::endl;
	std::cout << "sharedPtrTest: " << spPtr1 << "\t" << spPtr1.use_count() << std::endl;
	std::cout << "sharedPtrTest: " << spPtr2 << "\t" << spPtr2.use_count() << std::endl;
	std::cout << "sharedPtrTest: " << spPtr3 << "\t" << spPtr3.use_count() << std::endl;
	std::cout << "------------------------------------" << std::endl;

	// 接口调用
	sharedPtrTest01(spPtr1, spPtr2, spPtr3);

	std::cout << "------------------------------------" << std::endl;
	std::cout << "sharedPtrTest: " << spPtr1 << "\t" << spPtr1.use_count() << std::endl;
	std::cout << "sharedPtrTest: " << spPtr2 << "\t" << spPtr2.use_count() << std::endl;
	std::cout << "sharedPtrTest: " << spPtr3 << "\t" << spPtr3.use_count() << std::endl;
	std::cout << "------------------------------------" << std::endl;

	// 线程中
	std::thread thTest(sharedPtrTest01, std::ref(spPtr1), spPtr2, std::ref(spPtr3));
	thTest.join();

	std::cout << "------------------------------------" << std::endl;
	std::cout << "sharedPtrTest: " << spPtr1 << "\t" << spPtr1.use_count() << std::endl;
	std::cout << "sharedPtrTest: " << spPtr2 << "\t" << spPtr2.use_count() << std::endl;
	std::cout << "sharedPtrTest: " << spPtr3 << "\t" << spPtr3.use_count() << std::endl;
	std::cout << "------------------------------------" << std::endl;

	return;
}


void main()
{
    sharedPtrTest();
    getchar();
    return;
}


版权声明:本文为langxm2006原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。