问题描述
对ctypes了解不多,最近才开始接触.
Don't know much about ctypes, just recently began working with it.
我在类 C 的 dll 中有一个简单的函数,它返回指向动态生成的字符串的指针.
它工作正常,但是因为我为字符串手动分配了内存,所以我应该在使用后释放它.
I have a simple function in C-like dll which returns a pointer to the dynamically generated string.
It is working fine, but, because i manually allocated memory for the string, i should free it after use.
我有这样的事情:
extern "C" char* DLL_EXPORT func(const char* str1, const char* str2) { return getSomeString(str1, str2); } // Goal is to call this function correctly from Python. extern "C" void DLL_EXPORT freeMem(void *mem) { if(mem!=NULL) delete mem; }
但我不知道,如何将接收到的指针传回以在 Python 中删除?
But i don't have any idea, how can i pass received pointer back for deletion in Python?
推荐答案
你在正确的轨道上.
// TestDLL.cpp #include <string.h> // strcpy extern "C" __declspec(dllexport) char* stringdup(const char* str) { char* p = new char[strlen(str)+1]; strcpy(p,str); return p; } // if you have no good reason to use void*, use the type // you've allocated. while it usually works for built-in // types, it wouldn't work for classes (it wouldn't call // the destructor) extern "C" __declspec(dllexport) void stringfree(char* ptr) { // you don't need to check for 0 before you delete it, // but if you allocate with new[], free with delete[] ! delete [] ptr; }
在python中:
# Test.py import ctypes lib = ctypes.cdll.TestDLL # this creates a c-style char pointer, initialized with a string whose # memory is managed by PYTHON! do not attempt to free it through the DLL! cstr = ctypes.c_char_p("hello ctypes") # call the dll function that returns a char pointer # whose memory is managed by the DLL. p = lib.stringdup(cstr) # p is just an integer containing the memory address of the # char array. therefore, this just prints the address: print p # this prints the actual string print ctypes.c_char_p(p).value # free the memory through the DLL lib.stringfree(p)