2

我从另一个关于碎片的问题中借用了这个,但我对此并不感到困扰。我更担心我根本不了解该功能。在类型和数据生命周期方面:(

相同的数据由 std::vector(具有内部元数据的动态数组类型)、指向其中的字符串数据的指针(返回参数)和声明的返回类型(即 std:string)表示。

问题:当 std::vector 将被销毁时,数据如何安全地从函数中取出?它是隐式复制的吗?向量中的 char 动态数组是否与向量“分离”并作为 std::string 类型返回,因此不需要大容量复制?有时,我认为 C++ 和标准库试图让我...

我已经使用 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];
}
4

1 回答 1

14

a 存储的数据std::vector保证是连续的,因此&buffer[0]可以为您提供指向该数据开头的原始指针。1

并且std::string有一个构造函数,它接受 a const char *,它复制数据。这在 return 语句中被隐式调用(编译器最多可以调用一个隐式转换操作以避免编译时错误)。

在这两种情况下(thevectorstring样式字符串,并且不会超出缓冲区边界)。


1. 但是请注意,不能保证它会留在一个地方。一旦你扩大或缩小向量,它很可能会被复制到内存中的其他地方,从而使所有指向它的原始指针无效。如果vector自身被破坏,那么支持数据当然不再有效。

于 2012-04-16T21:06:40.727 回答