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(mxArray A,double data) として使用されます。ただし、これにより、小さなメモリリークが発生します(vの容量、サイズなどを処理するためのデータ構造体ですが、もちろんデータ自体ではありません)。
漏れなくできますか?