我正在和一个班级一起工作" foo"来自外部库,用于计算和存储大量数据。完成计算后,我想保留结果数据的数组,这大约是" foo"的一半大小。 Foo使用函数RawResultsArray()
和typeid PNSt3__17complexIdEE
提供指向结果数据的指针。
到现在为止,我一直这样做:
int N; //length of the results array
complex<double> * results_to_keep;
{
foo myFoo;
myFoo.findResults();
results_to_keep = new complex<double>[N];
for (auto i=0; i<N; i++)
{
results_to_keep[i] = myFoo.RawResultsArray()[i];
}
}
//work with results_to_keep in further code...
delete [] results_to_keep;
//do other memory intensive stuff in further code...
然而,我正在使用有限的内存,并且不能同时分配results_to_keep
数组和myFoo
类。有没有办法在第14行超出范围后将长度N*sizeof(complex<double>)
的数据保持在myFoo.RawResultsArray()
,而不是暂时再次分配完整数组?
我用智能指针玩弄失败了。我认为我最好的尝试是:
std::unique_ptr<complex<double>[]> results_to_keep;
{
foo myFoo;
myFoo.findResults();
std::unique_ptr<complex<double>[]> temp (move(myFoo.RawResultsArray());
results_to_keep = move(temp);
}
//work with results_to_keep in further code...
results_to_keep.reset();
//do other memory intensive stuff in further code...
这样,results_to_keep
确实成功保留了数据,但我无法用最后一行再次释放内存。它抛出malloc: *** error for object 0x106000010: pointer being freed was not allocated
。
其他信息:typeid(myFoo.RawResultsArray()).name()
发出PNSt3__17complexIdEE
。我正在使用Apple LLVM 8.1编译器。
答案 0 :(得分:4)
不,抱歉。
如果foo
“拥有”它封装的数据,完全管理该数据的生命周期,并且没有为您提供“窃取”该数据的方法,则无法将其复制到新的缓冲区。