我从另一个关于碎片的问题中借用了这个,但我并不为此烦恼。我更担心的是我根本不理解这个功能。在类型和数据生命周期方面:(
相同的数据由std :: vector(带有内部元数据的动态aray类型),指向其中的字符串数据的指针(返回参数)和声明的返回类型(std:string)表示。
问题: 当std :: vector将被销毁时,数据如何安全地从函数中移出?它被隐式复制了吗?向量中的char的动态数组是否已从向量'分离'并作为std :: string类型返回,因此不需要批量复制?有时,我认为C ++和std库试图让我...
我已经使用C ++了一段时间,但这样的事情就是我的'ed in。
std::string TestFragmentation()
{
std::vector<char> buffer(500);
SomeCApiFunction( &buffer[0], buffer.size() ); // Sets buffer to null-terminated string data
return &buffer[0];
}
答案 0 :(得分:14)
std::vector
存储的数据保证是连续的,因此&buffer[0]
会为您提供指向该数据开头的原始指针。 1
std::string
有一个构造函数,它带有const char *
,它复制数据。这是在return语句中隐式调用的(允许编译器最多调用一次隐式转换操作以避免编译时错误。)
在这两种情况下(vector
和string
),相应的后备缓冲区的内存由容器类管理,因此不存在内存泄漏或类似内容(这么长时间)因为你的原始C函数创建一个有效的以null结尾的C风格的字符串,并且不会超出缓冲区边界。)
<子> 1。但是请注意,不能保证它会留在一个地方。一旦你增长或缩小向量,它很可能会被复制到内存中的其他地方,使所有指向它的原始指针无效。如果vector
本身被破坏,那么后备数据当然不再有效。