将memcpy与unique_ptr一起用于向量

时间:2019-01-23 13:04:34

标签: c++

我正在编写一段代码,在这里我需要将指针复制到向量或向量的一部分-定义为:

std::unique_ptr<std::vector<unsigned int>> filtered_profile_ptr = 
  std::make_unique<std::vector<unsigned int>>((int)baselength);

指向向量的另一个指针-定义为:

std::unique_ptr<std::vector<unsigned int>> profile_vector = 
  std::make_unique<std::vector<unsigned int>>(length + filter_size - 1);

我正在使用memcpy函数进行操作-像这样:

memcpy(&(*profile_vector)[0], &(*profileVector)[length - win_size_left], win_size_left * sizeof(unsigned int));
memcpy(&(*profile_vector)[win_size_left], &(*profileVector)[0], length * sizeof(unsigned int));
memcpy(&(*profile_vector)[length + win_size_left], &(*profileVector)[0], win_size_right * sizeof(unsigned int));

我的问题是:以这种方式使用memcpy是否会提供一些隐藏的问题,在某些情况下与内存有关,或者与缓冲区有关。

P.S。代码运行良好,我只关心那些看不见的问题。

1 个答案:

答案 0 :(得分:0)

首先,几乎没有理由动态分配向量。您可以使用自动存储功能来简化程序:

std::vector<unsigned int> filtered_profile(baselength);
std::vector<unsigned int> profile_vector(length + filter_size - 1);

memcpy的隐藏问题是它仅适用于琐碎的可复制类型-对于其他类型,其行为是不确定的。当然,您的副本此刻可能微不足道(假设我已经正确读取了您的代码,因为您正在处理向量的内部缓冲区),但是无需依靠这些细微的细节:您可以使用{{ 1}},它也适用于非平凡类型。

除非我误读了您的程序,否则该程序应执行您的memcpy的操作。除此之外,它适用于没有智能指针的向量。至少对我来说,这更具可读性:

std::copy

P.S。请注意,命名两个变量assert(std::size(profileVector) >= length); auto srcB = std::begin(profileVector); // begin auto srcE = srcB + length; // end auto srcL = srcE - win_size_left; // left from end auto srcR = srcB + win_size_right; // right from begin assert(std::size(profile_vector) >= win_size_left + length + win_size_right); auto dst0 = std::begin(profile_vector); auto dst1 = dst0 + win_size_left; auto dst2 = dst1 + length; std::copy(srcL, srcE, dst0); std::copy(srcB, srcE, dst1); std::copy(srcB, srcR, dst2); profile_vector非常令人困惑。考虑重命名其中之一。此外,还不清楚profileVector与复制之间的关系。