2017-05-05 53 views
4

我正在使用外部庫中的「foo」類來計算和存儲大量數據。在完成計算後,我只想保留結果數據的數組,它佔「foo」大小的一半。 Foo用typeid PNSt3__17complexIdEE提供功能RawResultsArray()的結果數據指針。 到現在爲止,我一直在做這樣的:保持超出範圍的類的數據?

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類。有沒有辦法將長度爲N*sizeof(complex<double>)的數據保存在myFoo.RawResultsArray()之後,在超出第14行的範圍之後再次暫時分配整個陣列?

我沒有成功玩智能指針。我想我最好的嘗試是:

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

這個程序用什麼方式寫在C中? –

+1

您需要發佈foo類的定義,那麼我們可以說是否有可能將該數據移出它, – Slava

+0

如何將該數據複製到您實際擁有的緩衝區中? – mutex36

回答

4

不,對不起。

如果foo「擁有」它封裝的數據,完全管理數據的生命週期,並且不提供「竊取」數據的手段,除了將其複製到新緩衝區之外別無選擇。

+4

如果您告訴我們'foo' _really_是什麼,我們可能會想出一個真實世界的解決方法。雖然我不會屏住呼吸:) –