Skip to content

Commit

Permalink
Fixed a memory leak when marshalling std::string in C#.
Browse files Browse the repository at this point in the history
Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
  • Loading branch information
ddobrev committed Jul 12, 2017
1 parent d996053 commit a7cf984
Show file tree
Hide file tree
Showing 7 changed files with 826 additions and 215 deletions.

Large diffs are not rendered by default.

170 changes: 136 additions & 34 deletions src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

170 changes: 136 additions & 34 deletions src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs

Large diffs are not rendered by default.

170 changes: 136 additions & 34 deletions src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs

Large diffs are not rendered by default.

21 changes: 10 additions & 11 deletions src/Generator/Types/Std/Stdlib.cs
Expand Up @@ -96,21 +96,20 @@ public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
ClassTemplateSpecialization basicString = GetBasicString(type);
var c_str = basicString.Properties.First(p => p.OriginalName == "c_str");
var typePrinter = new CSharpTypePrinter(ctx.Context);
if (type.IsAddress() || ctx.Declaration is Field)
const string varBasicString = "__basicStringRet";
ctx.Before.WriteLine("var {0} = {1}.{2}({3});",
varBasicString, basicString.Visit(typePrinter),
Helpers.CreateInstanceIdentifier, ctx.ReturnVarName);
if (type.IsAddress())
{
ctx.Return.Write("{0}.{1}({2}).{3}",
basicString.Visit(typePrinter), Helpers.CreateInstanceIdentifier,
ctx.ReturnVarName, c_str.Name);
ctx.Return.Write($"{varBasicString}.{c_str.Name}");
}
else
{
const string varBasicString = "__basicStringRet";
ctx.Before.WriteLine("using (var {0} = {1}.{2}({3}))",
varBasicString, basicString.Visit(typePrinter),
Helpers.CreateInstanceIdentifier, ctx.ReturnVarName);
ctx.Before.WriteStartBraceIndent();
ctx.Return.Write($"{varBasicString}.{c_str.Name}");
ctx.HasCodeBlock = true;
const string varString = "__stringRet";
ctx.Before.WriteLine($"var {varString} = {varBasicString}.{c_str.Name};");
ctx.Before.WriteLine($"{varBasicString}.Dispose(false);");
ctx.Return.Write(varString);
}
}

Expand Down

0 comments on commit a7cf984

Please sign in to comment.