【发布时间】:2012-06-21 14:04:09
【问题描述】:
全部 我有一个遗留代码,它在草稿中做了这样的事情:
// sadly I have to use this structure
struct LegacyStruct {
int* values;
}
LegacyStruct* LgStr;
....
std::vector<int> vec;
// fill vector in some way here
size_t sz = vec.size();
LgStr->values = new int[sz];
std::copy(vec.begin(), vec.end(), &LgStr->values[0]);
vec 可能很大,我需要避免将其复制到 int*。 有没有办法做到这一点? 我尝试了以下操作:
// type of new operator explained in More Effective C++
LgStr->values = new (&vec[0])int[vec.size()];
好的,values 指向 vec 内部数组的开头,但是当 vec 超出范围时它被销毁了。但我必须保留它..
&vec[0] = nullptr; // does not compile of course
所以问题是:在这种情况下是否可以应用移动语义? 或者是其他什么技巧?
【问题讨论】:
-
你不能只处理 LgStr-> 值而不是向量吗?
-
如果您真正想要的是从
vector“释放”int的内部动态分配数组,并将该数组的所有权转移到LegacyStruct到delete[]一段时间后来,在向量被破坏后:不,你不能。唯一的好消息是,复制到您的数组不会比首先填充向量慢,因此错过的加速机会不到 50%。 -
只是一个快速的想法(a.k.a. HACK):您可以为
std::vector(第二个模板参数)编写自己的分配器并将deallocate实现为一个空函数。 -
@Andre 这将导致向量释放的所有内容的内存泄漏,但这不是您获得所有权的最终数组。但这可能是在正确的轨道上。
标签: c++ stl vector c++11 move-semantics