返回一个不会发生内存泄漏的c++ std::string对象
Is returning a C++ std::string object safe from memory leaks?
我对c++的字符串相当陌生,所以下面的模式可能有点难看。在开始对更大的系统进行集成测试之前,我正在检查我编写的一些代码。我想知道的是它是否安全,或者它是否容易泄漏内存?
string somefunc( void ) {
string returnString;
returnString.assign( "A string" );
return returnString;
}
void anotherfunc( void ) {
string myString;
myString.assign( somefunc() );
// ...
return;
}
我的理解是,returnString的值被分配给一个新的对象myString,然后作为解决调用somefuncc的一部分,returnString对象被销毁。在将来的某个时候,当myString超出作用域时,它也会被销毁。
我通常会将指向myString的指针传递给somefunc()并直接分配给myString的值,但我正在努力在我的代码中更清晰一点(并且更少地依赖于副作用函数风格)。
是的,以这种方式(按值)返回string
是安全的,尽管我更喜欢这样分配它:
string myString = somefunc();
这更容易阅读,也更高效(节省了空字符串的构造,然后将被下一次调用assign
覆盖)。
std::string
管理自己的内存,并且它有正确编写的复制构造函数和赋值操作符,所以这样使用字符串是安全的。
Yes by doing
return returnString
您正在调用字符串的复制构造函数。它将returnString的*复制到临时(也称为rValue)中,该临时(rValue)在调用表达式中代替"somefunc()":
myString.assign( somefunc() /*somefunc()'s return becomes temporary*/);
这又被传递给assign,并被assign用来执行对myString的复制。
所以在你的例子中,string的复制构造函数保证了深度复制,并确保没有内存泄漏。
*注意,这可能是也可能不是一个真正的深度复制,复制构造函数的行为是具体实现的。一些字符串库实现了写时复制(copy-on-write),它有一些内部簿记功能,以防止在实际需要之前进行复制。
您是完全安全的,因为您是按值返回字符串,其中字符串将被"复制",而不是通过引用。如果你要返回一个std::string &
,那么你就做错了,因为你有一个悬空引用。有些编译器甚至可能执行返回值优化,这甚至不会在返回时真正复制字符串。
是的,它(至少通常)是安全的。几乎所有合理的字符串类最基本的贡献之一就是能够充当一个基本值,而普通赋值、返回等"只是工作"。
正如您所说,在somefunc
内部创建字符串returnString
,并在函数返回时返回副本。这是非常安全的。
你想要的是给myString
到somefunc
的引用(不要使用指针)。这将非常清楚:
void somefunc( string& myString ) {
myString.assign( "A string" );
}
void anotherfunc( void ) {
string myString;
somefunc(myString);
// ...
return;
}
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存