gpt4 book ai didi

c++ - 怎么了?在四行代码中为相同的东西提供三种不同的类型?

转载 作者:太空狗 更新时间:2023-10-29 23:28:34 24 4
gpt4 key购买 nike

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

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

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

我已经使用 C++ 有一段时间了,但像这样的东西对我来说很重要。

std::string TestFragmentation()
{
std::vector<char> buffer(500);
SomeCApiFunction( &buffer[0], buffer.size() ); // Sets buffer to null-terminated string data
return &buffer[0];
}

最佳答案

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

std::string 有一个构造函数,它接受一个 const char *,它复制数据。即在返回语句中隐式调用(编译器最多只能调用一个隐式转换操作,以避免编译时错误)。

在这两种情况下(vectorstring),相应的后备缓冲区的内存都由容器类管理,所以不可能有内存泄漏或类似的(只要您的原始 C 函数创建一个有效的以 null 结尾的 C 样式字符串并且不会超出缓冲区边界)。


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

关于c++ - 怎么了?在四行代码中为相同的东西提供三种不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com