Free Pascal:释放对象时出现 SIGSEGV 错误
Free Pascal: SIGSEGV error when freeing objects
我的 Pascal 程序应该将来自 JSON 对象的 JSON 数据存储到一个文件中,但是当释放子对象时我得到一个 SIGSEGV 错误。
文件实际上是正确保存的,因为随后释放了相应的对象。
这是我的代码:
...
var dateiInhalt: TStringlist; jsondaten: string;
jsondatenobj,ebenejsondatensubobj,
sekundaerebenejsondatensubobj,
gjsonsubobj,hjsonsubobj,
ijsonsubobj: TJSONObject;
...
dateiInhalt := TStringlist.Create;
jsondatenobj := TJSONObject.Create;
ebenejsondatensubobj := TJSONObject.Create;
sekundaerebenejsondatensubobj := TJSONObject.Create;
gjsonsubobj := TJSONObject.Create;
hjsonsubobj := TJSONObject.Create;
ijsonsubobj := TJSONObject.Create;
ebenejsondatensubobj.Add('vector',TJSONArray.Create(['x','y','z']));
jsondatenobj.Add('ebene',ebenejsondatensubobj); // add subobject (does work)
sekundaerebenejsondatensubobj.Add('vector',TJSONArray.Create(['x','y','z']));
jsondatenobj.Add('sekundaerebene',sekundaerebenejsondatensubobj);
gjsonsubobj.Add('vector',TJSONArray.Create(['x','y','z']));
jsondatenobj.Add('g',gjsonsubobj);
jsondatenobj.Add('distance','5cm');
dateiInhalt.Add(jsondatenobj.AsJSON); // does work
ebenejsondatensubobj.Free; // no error for those freed objects
sekundaerebenejsondatensubobj.Free;
ijsonsubobj.Free;
hjsonsubobj.Free;
gjsonsubobj.Free;
dateiInhalt.SaveToFile(SaveDlgMain.FileName); // does work correctly
Application.MessageBox('File saved successfully','Saved', MB_ICONINFORMATION);
jsondatenobj.Free; // SIGSEGV appears here
showMessage('test');
dateiInhalt.Free;
...
我已经尝试更改 .free
命令的顺序,但在某些时候总是有 SIGSEGV。
我该怎么办?
提前致谢!
不要释放您已经传递给其他对象的对象。例如
jsondatenobj.Add('g',gjsonsubobj);
将 gjsonsuobj 添加到 jsondatenobj,因此当释放 jsondateobj 时,gjsonsuobj 也会被释放。
如果你在 valgrind 中 运行 这个,你可能会得到一些双重免费。
我的 Pascal 程序应该将来自 JSON 对象的 JSON 数据存储到一个文件中,但是当释放子对象时我得到一个 SIGSEGV 错误。
文件实际上是正确保存的,因为随后释放了相应的对象。
这是我的代码:
...
var dateiInhalt: TStringlist; jsondaten: string;
jsondatenobj,ebenejsondatensubobj,
sekundaerebenejsondatensubobj,
gjsonsubobj,hjsonsubobj,
ijsonsubobj: TJSONObject;
...
dateiInhalt := TStringlist.Create;
jsondatenobj := TJSONObject.Create;
ebenejsondatensubobj := TJSONObject.Create;
sekundaerebenejsondatensubobj := TJSONObject.Create;
gjsonsubobj := TJSONObject.Create;
hjsonsubobj := TJSONObject.Create;
ijsonsubobj := TJSONObject.Create;
ebenejsondatensubobj.Add('vector',TJSONArray.Create(['x','y','z']));
jsondatenobj.Add('ebene',ebenejsondatensubobj); // add subobject (does work)
sekundaerebenejsondatensubobj.Add('vector',TJSONArray.Create(['x','y','z']));
jsondatenobj.Add('sekundaerebene',sekundaerebenejsondatensubobj);
gjsonsubobj.Add('vector',TJSONArray.Create(['x','y','z']));
jsondatenobj.Add('g',gjsonsubobj);
jsondatenobj.Add('distance','5cm');
dateiInhalt.Add(jsondatenobj.AsJSON); // does work
ebenejsondatensubobj.Free; // no error for those freed objects
sekundaerebenejsondatensubobj.Free;
ijsonsubobj.Free;
hjsonsubobj.Free;
gjsonsubobj.Free;
dateiInhalt.SaveToFile(SaveDlgMain.FileName); // does work correctly
Application.MessageBox('File saved successfully','Saved', MB_ICONINFORMATION);
jsondatenobj.Free; // SIGSEGV appears here
showMessage('test');
dateiInhalt.Free;
...
我已经尝试更改 .free
命令的顺序,但在某些时候总是有 SIGSEGV。
我该怎么办?
提前致谢!
不要释放您已经传递给其他对象的对象。例如
jsondatenobj.Add('g',gjsonsubobj);
将 gjsonsuobj 添加到 jsondatenobj,因此当释放 jsondateobj 时,gjsonsuobj 也会被释放。
如果你在 valgrind 中 运行 这个,你可能会得到一些双重免费。