相关疑难解决方法(0)

垃圾收集和cgo

是否可以在Go句柄中生成垃圾收集器并释放通过C代码分配的内存?我道歉,我之前没有使用过C和cgo,所以我的例子可能需要一些澄清.

假设你有一些你想要使用的C库,这个库会分配一些需要手动释放的内存.我想做的是这样的事情:

package stuff

/*
#include <stuff.h>
*/
import "C"

type Stuff C.Stuff

func NewStuff() *Stuff {
    stuff := Stuff(C.NewStuff()) // Allocate memory

    // define the release function for the runtime to call
    // when this object has no references to it (to release memory)   
    // In this case it's stuff.Free()     

    return stuff

}

func (s Stuff) Free() {
    C.Free(C.Stuff(s)) // Release memory
}
Run Code Online (Sandbox Code Playgroud)

当Go运行时没有对*Stuff的引用时,垃圾收集器是否有任何方法可以调用Stuff.Free()?

我在这里有道理吗?

也许更直接的问题是:是否有可能通过编写运行时在对该对象有零引用时调用的函数,使运行时自动处理C分配内存的清理?

garbage-collection go cgo

11
推荐指数
1
解决办法
1499
查看次数

从C#字符串将char *传递给C DLL

我需要在C#应用程序的DLL中使用C函数库。我在用char *参数调用DLL函数时遇到麻烦:

C DLL:

extern "C" __declspec(dllexport) int CopyFunc(char *, char *);
int CopyFunc(char *dest, char *src)
{
    strcpy(dest, src);
    return(strlen(src));
}
Run Code Online (Sandbox Code Playgroud)

C#应用程序需要看起来像这样:

[DllImport("dork.dll")]
public static extern int CopyFunc(string dst, string src);

int GetFuncVal(string source, string dest)
{
    return(CopyFunc(dest,source));
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了使用string或StringBuilder或IntPtr代替DLL函数原型所需的char *的示例,但是我无法使它们中的任何一个起作用。我得到的最常见的例外是PInvoke正在取消堆栈的平衡,因为函数调用与原型不匹配。

有一个简单的解决方案吗?

c# c++ dll

4
推荐指数
1
解决办法
3659
查看次数

标签 统计

c# ×1

c++ ×1

cgo ×1

dll ×1

garbage-collection ×1

go ×1