Python 将指向动态指定变量的指针传递给要删除的函数

Python 将指向动态指定变量的指针传递给要删除的函数,python,pointers,ctypes,Python,Pointers,Ctypes,libtestm.dll代码 #pragma once #define EXPORT extern "C" __declspec(dllexport) #include <iostream> #include <vector> class TestValue { public: std::vector<int> v; TestValue() { for (size_t i = 0; i < 1

libtestm.dll代码

#pragma once
#define EXPORT extern "C" __declspec(dllexport)
#include <iostream>
#include <vector>

class TestValue
{
public:
    std::vector<int> v;
    TestValue()
    {
        for (size_t i = 0; i < 10; i++)
        {
            v.push_back(i);
        }
    }
    ~TestValue()
    {
        std::cout << "Deteled Test Value" << std::endl;
    }
};

EXPORT TestValue *TestReturn()
{
    return new TestValue();
}

EXPORT size_t TestData(TestValue *pt, int **array)
{
    *array = pt->v.data();
    return pt->v.size();
}

EXPORT void TestDelete(TestValue *pt)
{
    if(pt)
    {
        delete pt;
    }
}
运行此代码时的控制台输出

Deteled Test Value
Traceback (most recent call last):
  File "d:\MyProjects\GitRepo\CodePython\Dlls\TestLib.py", line 31, in <module>
    __dll__.TestDelete(v)
OSError: exception: access violation reading 0x00000000A20E2490
Deteled测试值
回溯(最近一次呼叫最后一次):
文件“d:\MyProjects\GitRepo\CodePython\Dlls\TestLib.py”,第31行,在
__dll_uuu.TestDelete(v)
OSError:异常:访问冲突读取0x00000000A20E2490

使用C++的标准库很难使用python的cType,所以我试图通过在一个类中封装它来使用它。释放指向动态分配变量的指针已成功,但出现错误。请让我知道我错了什么。谢谢。

这是大多数
ctypes
用户的标准错误
ctypes
假设未指定参数类型,这通常是
c_int
或参数指针,而
c_int
表示返回类型。由于
TestValue*
为64位,因此返回值的
c_int
为32位并截断它。解决方法是养成习惯,总是为使用的每个函数指定
.argtypes
.restype

test.cpp:

#pragma一次
#定义导出外部“C”\u declspec(dllexport)
#包括
#包括
类TestValue{
公众:
std::向量v;
TestValue(){
对于(int i=0;i<10;i++)
v、 推回(i);
}
~TestValue(){
标准::cout v.size();
}
导出void TestDelete(TestValue*pt){
if(pt)
删除pt;
}
test.py:

从ctypes导入*
dll=CDLL('./测试')
dll.TestReturn.argtypes=()
dll.TestReturn.restype=c\u void\u p
dll.TestData.argtypes=c_void_p,指针(指针(c_int))
dll.TestData.restype=c\u size\u t
dll.TestDelete.argtypes=c\u void\u p,
dll.TestDelete.restype=None
v=dll.TestReturn()
数据=指针(c_int)()
size=dll.TestData(v,byref(数据))
打印(数据[:大小])
dll.TestDelete(v)
输出:

[0,1,2,3,4,5,6,7,8,9]
删除的测试值

非常感谢!尽管我跳过了64位配置,但更感谢您的完整解释。正如您所说,我是C++和Python的初学者。我需要进一步研究。再次感谢您的完美答案。
Deteled Test Value
Traceback (most recent call last):
  File "d:\MyProjects\GitRepo\CodePython\Dlls\TestLib.py", line 31, in <module>
    __dll__.TestDelete(v)
OSError: exception: access violation reading 0x00000000A20E2490