Я пытаюсь создать два класса, Volume и Slice, и создать метод в Volume, чтобы он мог вернуть часть своих данных в виде объекта Slice. Я хочу, чтобы два объекта совместно использовали память, чтобы изменить любой из них изменит те же данные. В настоящее время у меня есть:
#include <complex>
using namespace std;
class Slice{
public:
Slice(unsigned long Nx,unsigned long Ny){ //Contructor
nx = Nx;
ny = Ny;
data = new complex<double>[Nx*Ny];
}
Slice(unsigned long Nx,unsigned long Ny,complex<double>* inputDataPtr){ //Contructor
nx = Nx;
ny = Ny;
data = inputDataPtr;
}
Slice(const Slice& inputObj){ // Copy contructor
nx = inputObj.nx;
ny = inputObj.ny;
data = inputObj.data;
}
~Slice(){ //destructor
delete data;
}
private:
// DATA:
unsigned long nx;
unsigned long ny;
complex<double>* data;
};
class Volume{
public:
Volume(unsigned long Nx,unsigned long Ny,unsigned long Nz){ //Contructor
nx = Nx;
ny = Ny;
nz = Nz;
data = new complex<double>[Nx*Ny*Nz];
}
~Volume(){ //destructor
delete data;
}
const Slice& get_slice(unsigned long zindex){
return Slice(nx,ny, &(data[zindex*nx*ny]));
}
private:
// DATA:
unsigned long nx;
unsigned long ny;
unsigned long nz;
complex<double>* data;
};
int main(){
unsigned long Nx = 1;
unsigned long Ny = 2;
unsigned long Nz = 3;
Volume testVolume(Nx,Ny,Nz);
/* initialise data in testVolume */
Slice slice = testVolume.get_slice(1);
return 0;
}
Мне также нужно иметь возможность создавать отдельные слайсы, которые не связаны с объемом, поэтому класс слайсов должен также выделять свой собственный указатель.
Когда я запускаю это, он говорит, что *** free (): неверный указатель: 0x0000000000ff1180 ***
Я думаю, проблема в том, что когда я вызываю метод get_slice из testVolume, код уничтожает временный объект слайса. в ответ он пытается освободить несуществующий указатель и вызвать проблемы.
Как мне избежать этого? После небольшого поиска мне, вероятно, нужен умный указатель shared_ptr? Как мне это включить?
Спасибо.