-
Notifications
You must be signed in to change notification settings - Fork 519
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fixing a memory leak #1099
base: main
Are you sure you want to change the base?
Fixing a memory leak #1099
Conversation
This part of the code makes a copy of the original reference without calling the destructor at any time for it (original reference). Instead of using a default constructor / copy constructor and then one destructor for each, such C++ copy elision optimization, it's better to simply remove copy. Simple example of the problem: public global::Lldb.SBSymbolContext GetSymbolContext(uint resolve_scope) { var __ret = new global::Lldb.SBSymbolContext.__Internal(); __Internal.GetSymbolContext((__Instance + __PointerAdjustment), new IntPtr(&__ret), resolve_scope); // here __ret is initialized like a constructor return global::Lldb.SBSymbolContext.__CreateInstance(__ret); } internal static global::Lldb.SBSymbolContext __CreateInstance(global::Lldb.SBSymbolContext.__Internal native, bool skipVTables = false) { return new global::Lldb.SBSymbolContext(native, skipVTables); } private SBSymbolContext(global::Lldb.SBSymbolContext.__Internal native, bool skipVTables = false) : this(__CopyValue(native), skipVTables) { __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; } private static void* __CopyValue(global::Lldb.SBSymbolContext.__Internal native) { var ret = Marshal.AllocHGlobal(sizeof(global::Lldb.SBSymbolContext.__Internal)); global::Lldb.SBSymbolContext.__Internal.cctor(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } After the fix: private static void* __CopyValue(global::Lldb.SBSymbolContext.__Internal native) { var ret = Marshal.AllocHGlobal(sizeof(global::Lldb.SBSymbolContext.__Internal)); *(global::Lldb.SBSymbolContext.__Internal*) ret = native; return ret.ToPointer(); }
|
0464938
to
637018f
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The generated code now does not call the non-trivial constructor if any. I think this might lead to incorrect behaviours on the native side.
91e219c
to
32da859
Compare
a0169c2
to
3ea7e97
Compare
a1559de
to
304d673
Compare
a08e24b
to
0e1fb0b
Compare
1610aa5
to
64b1efd
Compare
c930b78
to
c38556a
Compare
4c1e9b8
to
2fdd082
Compare
bcf41e4
to
851ec5e
Compare
97610ec
to
a2aeaed
Compare
This part of the code makes a copy of the original reference without calling the destructor at any time for it (original reference).
Instead of using a default constructor / copy constructor and then one destructor for each, such C++ copy elision optimization, it's better to simply remove copy.
Simple example of the problem:
After the fix: