【发布时间】:2021-10-20 10:28:23
【问题描述】:
我有以下文件:
test.h:
extern "C" {
void* createTest();
void getStrings(void* test_ptr, char*** strings, size_t* length);
}
test.cpp:
#include <vector>
#include "test.h"
class Test {
public:
Test() {
strings.push_back("test1");
strings.push_back("test2");
strings.push_back("test3");
strings.push_back("test4");
}
std::vector<char *>& getStrings() {
return strings;
}
private:
std::vector<char *> strings;
};
void* createTest() {
return reinterpret_cast<void *>(new Test());
}
void getStrings(void* test_ptr, char*** strings, size_t* length) {
auto inst = reinterpret_cast<Test *>(test_ptr);
auto strs = inst->getStrings();
*strings = strs.data();
*length = strs.size();
}
test.py:
from ctypes import *
lib = cdll.LoadLibrary("test.so")
test_ptr = c_void_p()
test_ptr = lib.createTest()
strs_arr = POINTER(c_char_p)()
strs_len = c_size_t()
lib.getStrings(test_ptr, byref(strs_arr), byref(strs_len))
for i in range(0, strs_len.value):
print("var {}: data={}".format(i, strs_arr[i]))
我想要实现的是通过 python 检索从 c++ 类成员获得的字符串数组,但是,数据似乎最终以某种方式损坏,因为这是我在执行 python 文件时得到的:
var 0: data=None
var 1: data=b'\x04'
var 2: data=b'test3'
var 3: data=b'test4'
我正在使用以下指令进行编译:
clang++-12 -fPIC -g -c test.cpp -o test.o
clang++-12 -fPIC -g -shared test.o -o test.so
有人知道我做错了什么吗?我试过改变 ctypes 但我总是得到相同的结果。我也尝试过使用 gdb 进行调试,并在 getStrings(void* test_ptr, ...) 中设置断点显示到那时数据仍然完好无损。
【问题讨论】:
-
new已经返回void*afaik。我将void getStrings中的前两行更改为Test*和std::vector<char*>而不是auto,它有效,但我不知道为什么 -
更改为
std::vector<char *>对我不起作用,但更改为std::vector<char *>&对我有用。我认为这意味着 clang 认为 auto 不是对向量的引用,即使inst->getStrings()的返回类型是引用?我很困惑,但我的问题已经解决了,所以谢谢你:D -
抱歉错字我也打算写参考
-
@Lala5th 也许将其发布为答案?它似乎已经解决了 OP 的问题。