我有一个原始指针,比方说,
char * ptr = (char *) malloc(LIMIT);
size_t size;
fill_with_data(ptr, LIMIT, &size);
现在我想使用std::vector
包装指针数据。
auto v = vector<char>(ptr, ptr + size);
但我认为使用上面的语法会生成指针内容的副本。有没有办法将原始指针转换为vector而不复制内存中的数据?
答案 0 :(得分:4)
A std::vector
¹不能使用现有的缓冲区。
如果要自动化现有缓冲区的生命周期管理,可以使用智能指针,例如std::unique_ptr
或std::shared_ptr
。
注意:
¹技术上可以使用自定义分配器来欺骗std::vector
使用现有缓冲区,但是暴露该缓冲区中的数据将不得不依赖于实现的非可移植方面。
功能
答案 1 :(得分:3)
正如其他人所说,你不能让一个向量接管由其他东西分配的内存。但也许你可以在第一时间使用向量来分配它:
std::vector theData(LIMIT);
size_t size;
fill_with_data(theData.data(), LIMIT, &size);
theData.resize(size);
data()
提供对其内部连续缓冲区的访问,fill_with_data
可以写入该缓冲区。以下resize()
可确保向量的行为就像它只包含size
个数据量一样。
答案 2 :(得分:-1)
没有。 vector是一个容器,它与内存中的基类型数据不同。您可以对基本类型数据使用类型转换。你不能自己指出矢量元素的记忆地址。