将原始指针内容移动到矢量

时间:2016-08-21 14:05:33

标签: c++ c++11 vector

我有一个原始指针,比方说,

char * ptr = (char *) malloc(LIMIT);  
size_t size;  
fill_with_data(ptr, LIMIT, &size);  

现在我想使用std::vector包装指针数据。

auto v = vector<char>(ptr, ptr + size);

但我认为使用上面的语法会生成指针内容的副本。有没有办法将原始指针转换为vector而不复制内存中的数据?

3 个答案:

答案 0 :(得分:4)

A std::vector¹不能使用现有的缓冲区。

如果要自动化现有缓冲区的生命周期管理,可以使用智能指针,例如std::unique_ptrstd::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是一个容器,它与内存中的基类型数据不同。您可以对基本类型数据使用类型转换。你不能自己指出矢量元素的记忆地址。