保持超出范围的类的数据?

时间:2017-05-05 14:15:54

标签: c++ arrays memory smart-pointers

我正在和一个班级一起工作" 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编译器。

1 个答案:

答案 0 :(得分:4)

不,抱歉。

如果foo“拥有”它封装的数据,完全管理该数据的生命周期,并且没有为您提供“窃取”该数据的方法,则无法将其复制到新的缓冲区。