我从另一个关于碎片化的问题中借用了这个,但我并不为此烦恼.我更担心的是我根本不理解这个功能.在类型和数据生命周期方面:(
相同的数据由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];
}
Run Code Online (Sandbox Code Playgroud)
Oli*_*rth 14
a存储的数据std::vector保证是连续的,因此&buffer[0]可以获得指向该数据开头的原始指针.1
并std::string有一个构造函数,它采取a const char *,复制数据.这是在return语句中隐式调用的(允许编译器最多调用一次隐式转换操作以避免编译时错误).
在这两种情况下(vector和string),相应的后备缓冲区的内存由容器类管理,因此不存在内存泄漏或类似内容(只要原始C函数创建有效的以空值终止的C-样式字符串,不会超出缓冲区范围).
但请注意,不能保证它会留在一个地方.一旦你增长或缩小向量,它很可能会被复制到内存中的其他地方,使所有指向它的原始指针无效.如果它vector本身被破坏,那么背景数据当然不再有效.