【发布时间】:2021-03-23 14:54:37
【问题描述】:
考虑一下这个 mcve:
mcve.h
#pragma once
#include <windows.h>
class Windows {
public:
static HWND GetActiveWindow();
static HWND GetForegroundWindow();
};
mcve.cpp
#include "mcve.h"
HWND Windows::GetActiveWindow() {
return ::GetActiveWindow();
}
HWND Windows::GetForegroundWindow() {
return ::GetForegroundWindow();
}
mcve.i
%module mcve
%include <std_string.i>
%include <std_vector.i>
%include <typemaps.i>
%include <windows.i>
%include <cpointer.i>
%include <carrays.i>
%{
#include "mcve.h"
%}
%include "mcve.h"
setup.py
from distutils.core import Extension
from distutils.core import setup
setup(
name="mcve",
ext_modules=[
Extension(
"_mcve",
sources=["mcve.i", "mcve.cpp", "mcve_wrap.cpp"],
swig_opts=["-c++", "-python"],
include_dirs=["."],
library_dirs=[
"D:/software/vcpkg/installed/x86-windows/lib"
],
libraries=["user32"]
)
],
py_modules=["mcve"],
)
要运行它,请确保正确调整 library_dirs 变量,然后只需键入:
python setup.py build_ext --inplace
如果扩展已成功生成,那么您只需运行python test.py,您应该会看到类似以下的输出:
>python test.py
swig/python detected a memory leak of type 'HWND *', no destructor found.
swig/python detected a memory leak of type 'HWND *', no destructor found.
我知道你可以使用 swig -nodefaultdtor 来不生成隐式默认析构函数,我已经尝试过,但没有任何区别。
为了完整起见,HWND typedef 大致如下所示:
typedef PVOID HANDLE;
typedef HANDLE HWND;
typedef void *PVOID;
问题: swig 中防止 HWND 内存泄漏的正确方法是什么?
【问题讨论】:
-
FYI
test.py被提及,但未提供。
标签: python c++ windows memory-leaks swig