Есть ли способ передать право собственности на данные, содержащиеся в std::vector (на которые указывает, скажем, T * data), в другую конструкцию, предотвращая превращение «данных» висячего указателя после того, как вектор выходит из области видимости?
РЕДАКТИРОВАТЬ: Я НЕ ХОЧУ КОПИРОВАТЬ ДАННЫЕ (что было бы простым, но неэффективным решением).
В частности, я хотел бы иметь что-то вроде:
template<typename T>
T* transfer_ownership(vector<T>&v){
T*data=&v[0];
v.clear();
...//<--I'd like to make v's capacity 0 without freeing data
}
int main(){
T*data=NULL;
{
vector<double>v;
...//grow v dynamically
data=transfer_ownership<double>(v);
}
...//do something useful with data (user responsible for freeing it later)
// for example mxSetData(mxArray*A,double*data) from matlab's C interface
}
Единственное, что приходит мне в голову, чтобы подражать этому:
{
vector<double>*v=new vector<double>();
//grow *v...
data=(*v)[0];
}
а затем данные позже будут либо освобождены, либо (в моем случае) использованы как mxSetData(mxArrayA,doubledata). Однако это приводит к небольшой утечке памяти (структура данных для обработки емкости, размера и т. д. v... но, конечно, не сами данные).
Можно ли без течи?