tnie / TestDll

学习 dll 导出函数、导出变量
7 stars 1 forks source link

传值和传常量引用,在作为公共接口时有区别吗? #3

Closed tnie closed 6 years ago

tnie commented 6 years ago
void hello(std::string name);
void hello(const std::string& name);  // std::string const * const 

后者不会造成跨模块管理内存,前者呢?——运行时报错 __acrt_first_block == header

std::string hello(void);

会产生「跨模块内存管理」问题吗?——会

std::string& hello(void)

返回引用呢?——不会,但需要注意引用本体的生存周期

tnie commented 6 years ago
void hello(std::string* pstr);

会产生「跨模块内存管理」问题吗?——会!在跨模块中显式调用 resize() ,程序必然崩溃 __acrt_first_block == header

ps

突然想起来 《Google C++ 编程规范》中硬性约定:

所有按引用传递的参数必须加上 const

string作为输出参数时只能用 string*

void Foo(const string& in, string* out);

不过,在论述为什么坚持上述约定时,未提到跨模块管理内存的梗,只是单纯地描述:

引用在语法上是值却拥有指针的语义,容易引起误解。

tnie commented 6 years ago

试验结果

// 作为输入
_ADD_API void helloValue(std::string name);                 // ×
_ADD_API void helloRef(const std::string& name);            // √
_ADD_API void helloPointer(const std::string* const name);  // 〇 满足功能,比较丑而已
// 作为输出
_ADD_API std::string  returnValue(void);                    // ×
_ADD_API std::string& returnRef(void);                      // 〇 功能不完善,需要保证引用源有效
_ADD_API bool returnPointer(std::string* out);              // ×
_ADD_API bool returnSmartPtr(std::shared_ptr<std::string> out);              // ×
_ADD_API bool returnSmartPtr2(std::shared_ptr<std::string>& out);            // ×
_ADD_API bool returnSmartPtr3(const std::shared_ptr<std::string>& out);      // ×

_ADD_API bool fillv(std::shared_ptr<std::vector<std::string>>& out);          // ×
_ADD_API std::shared_ptr<std::vector<std::string>> returnv();                 // ×

结论