首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何创建和使用存储为c++对象的python对象?

如何创建和使用存储为c++对象的python对象?
EN

Stack Overflow用户
提问于 2020-05-11 23:59:23
回答 1查看 108关注 0票数 1

因此,正如标题所暗示的,我正在处理一个c++项目,在该项目中,我需要调用一个python模块,将其另存为一个对象,并多次调用它的一个方法。您可以在下面找到该类的代码,其中包含python对象。目前,它是在一个for循环中实现的,该循环多次调用该方法。实例化类以及对类的第一次调用都可以很好地工作。然而,在完成for循环的第一个循环后,程序崩溃,并出现" free ():invalid size“或有时"double free or corruption”的错误。我试着使用valgrind来追踪内存泄漏,但我得到了很多pythonCApi调用的痕迹,我并不是真的理解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <python2.7/Python.h>
#include <iostream>
#include <algorithm>
#include "predictor.hpp"

using namespace std;


predictor::predictor()
{
  Py_Initialize();

  pName = PyString_FromString("predictor");

  pModule = PyImport_Import(pName);

  Py_XDECREF(pName);

  if (pModule == nullptr) {
    PyErr_Print();
    std::cerr << "Fails to import the module predictor, check installation.\n";
  }

  // dict is a borrowed reference.
  dict = PyModule_GetDict(pModule);
  if (dict == nullptr) {
    PyErr_Print();
    std::cerr << "Fails to get the dictionary, check predictor installation.\n";
    Py_XDECREF(pModule);
  }
  Py_XDECREF(pModule);

  // Builds the name of a callable class
  python_class = PyDict_GetItemString(dict, "Predictor");
  if (python_class == nullptr || python_class == NULL) {
    PyErr_Print();
    std::cerr << "Fails to get the Python class, check predictor installation.\n";
    Py_XDECREF(dict);
  }
  Py_XDECREF(dict);

  // Creates an instance of the class
  if (PyCallable_Check(python_class)) {
    object = PyObject_CallObject(python_class, nullptr);
    if (object == NULL)
    {
        cerr << "Fails to create object.";
        Py_XDECREF(python_class);
    }
    Py_XDECREF(python_class);
} else {
    PyErr_Print();
    std::cout << "Cannot instantiate the Python class" << std::endl;
    Py_XDECREF(python_class);
}

pMethod = PyString_FromString("predict_all");

}


predictor::~predictor()
{

  Py_XDECREF(pMethod);

  Py_XDECREF(object);
  Py_Finalize();

}


long predictor::predict(string rule)
{

  PyObject *pRule = PyString_FromString(rule.c_str());
  PyObject *value = PyObject_CallMethodObjArgs(object, pMethod, pRule, NULL);

  long endValue = PyInt_AsLong(value);

  if (endValue == -1)
  {
    if(!PyErr_Occurred())
    {

        PyErr_Print();
        cerr << "";

        Py_XDECREF(value);
        Py_XDECREF(pRule); 

        return NULL;
    }

    //PyErr_Print();

  }

  Py_XDECREF(value);
  Py_XDECREF(pRule); 

  return endValue;}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-12 07:42:16

编写Python C/C++代码的最关键部分是正确的引用计数。Python区分不同类型的引用,即newstolenborrowed引用。

对于您调用的每个API函数,您必须检查文档以查看它返回的引用类型(如果有)。

新的引用属于调用者,所以使用Py_XDECREF通过减少引用计数来释放对象是正确的。请确保不要多次调用Py_XDECREF,除非您在两次调用之间增加了引用计数。在错误处理中,Py_XDECREF(pModule)会发生两次,例如,因为在错误情况下没有返回,所以只需继续。

借用的引用归其他人所有,引用计数不会为您递增。因此,只有在执行此操作之前您自己增加了引用计数,调用Py_XDECREF才有效。

PyModule_GetDict(pModule)返回一个借用的引用。您不会递增引用计数,但稍后会使用Py_XDECREF(dict)递减它。对于PyDict_GetItemString(dict, "predictor")也是如此,它返回一个借用的引用,但您使用Py_XDECREF(python_class)递减它。

我的假设是,在这两种情况下(dictpython_class),借用的引用都属于您使用PyImport_Import(pName)导入的模块pModule。因此,只要您使用的是pModule拥有的借用引用,就很可能不能减少pModule引用计数。一旦你不再使用这些借用的引用,就使用Py_XDECREF发布pModule。或者,您可以递增借用的引用的引用计数,但只要您保持pModule不变,就不需要这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61741451

复制
相关文章
zTree设置异步加载后展开
//不能直接配置展开属性 因为没有数据,需要添加回调函数,异步加载成功展开 callback: { onAsyncSuccess: zTreeOnAsyncSuccess } //异步加载成功回调函数 function zTreeOnAsyncSuccess(event, treeId, treeNode, msg){ $.fn.zTree.getZTreeObj(treeId).expandAll(true); }
河岸飞流
2019/08/09
1.2K0
android获取textview展开渲染后的高度
    当你需要获取textview真正高度时,相信会有不少人会在onCreate函数中调用textview的getHeight()方法,简单粗暴,确实,这是个很方便的方法,但是不幸的是textview在onCreate中根本还没有展开,所以根本获取不到textview的真正高度,因此我们需要给textview绑定一个监听器,在渲染结束后调用,方法如下: ViewTreeObserver observer = contentView.getViewTreeObserver(); observer.a
forrestlin
2018/05/24
1.7K0
Linux登录后显示提示信息
Linux可以设置登录前后的欢迎信息,虽然没啥技术含量,但却是非常实用的一个小技巧。 实现登录消息的功能,可以修改3个文件。
知识浅谈
2020/03/25
4.8K0
Firefox 扩展开发 扩展学习 工具
要开发Firefox扩展当然需要一些工具和教程,这里根据笔者的所得,略略写一下: 教程:   教程嘛,网上基本没有什么中文资料,最多也就一个简单,非常简单的入门说明。所以教程还是以官网的为主:https://developer.mozilla.org/En 工具:   官网的教程中,会提到一些工具。   1.Firefox 3.0,这个肯定必不可少了。在此推荐3.0,因为最新版3.6或者3.7,那些扩展还没有更新跟进,所以要想安装更多的扩展,还是以3.0为好。   2.Firebug,这个不必多说。虽然我只
用户1258909
2018/07/03
7210
Toast提示工具类
APP开发中我们常用的与用户交互的消息就是Toast 但是Android原生的Toast 比较繁琐, 我们来比较一下
晨曦_LLW
2020/09/25
6460
axure 发布后隐藏顶部菜单 或展开顶部菜单[通俗易懂]
axure 9.0 版本在发布后HTML页面打开时总是在顶部弹出菜单 既不美观也影响效果
全栈程序员站长
2022/09/23
1.6K0
axure 发布后隐藏顶部菜单 或展开顶部菜单[通俗易懂]
Discourse 升级后提示 https 混合内容
其实 Discourse 如果安装的时候使用了 https ,那么你可用修改配置强制所有内容都使用 https。
HoneyMoose
2020/10/05
5450
Discourse 升级后提示 https 混合内容
bootstrap 提示工具 常用样式
<h4>工具提示(Tooltip)插件 - 锚</h4> 这是一个 <a href="#" class="tooltip-test" data-toggle="tooltip" title="默认的 Tooltip">默认的 Tooltip</a>. 这是一个 <a href="#" class="tooltip-test" data-toggle="tooltip" data-placement="left" title="左侧的 Tooltip">左侧的 Tooltip</a>. 这是一个 <a href="#" data-toggle="tooltip" data-placement="top" title="顶部的 Tooltip">顶部的 Tooltip</a>. 这是一个 <a href="#" data-toggle="tooltip" data-placement="bottom" title="底部的 Tooltip">底部的 Tooltip</a>. 这是一个 <a href="#" data-toggle="tooltip" data-placement="right" title="右侧的 Tooltip">右侧的 Tooltip</a> <h4>工具提示(Tooltip)插件 - 按钮</h4> <button type="button" class="btn btn-default" data-toggle="tooltip" title="默认的 Tooltip"> 默认的 Tooltip</button> <button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="left" title="左侧的 Tooltip">左侧的 Tooltip </button> <button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="top" title="顶部的 Tooltip">顶部的 Tooltip </button> <button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="bottom" title="底部的 Tooltip">底部的 Tooltip </button> <button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="right" title="右侧的 Tooltip">右侧的 Tooltip</button> <script>
用户5760343
2019/07/05
7060
bootstrap 提示工具 常用样式
Mac 更新 Catalina 后 git 提示xcrun error
Сannot Run Git xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 这是因为更新系统后会卸载xcode,重新安装后会缺失xcode的命令行工具(command line tools),所以导致部分工具无法在终端运行。 第一种方法: 运行以下命令: xcode-select --install 并下载xcode命令行工具即可。 第二种方法: cd /Library/Developer/CommandLineTools/usr/bin/ ll | grep "xcrun" 如果结果为空,则表示找不到。 执行: sudo ln -s /usr/bin/xcrun
KEVINGUO_CN
2020/03/17
1.2K0
AngularDart Material Design 工具提示 顶
工具提示卡的目标可以是任何元素,例如按钮,输入,链接等。目标也可以是help_outline图标,其充当实际目标的代理。
南郭先生
2018/09/30
1.3K0
kite pro 代码提示完成工具
api sdk查询,在搜索栏输入后点击右侧的搜索, docs are following cursor,自动查询光标选中的文本对应的sdk
sofu456
2021/02/02
8700
如何在使用了updatepanel后弹出提示信息
转载:http://www.cnblogs.com/brusehht/archive/2009/03/19/1416802.html
跟着阿笨一起玩NET
2018/09/19
9410
解决macos安装软件后提示已损坏问题
我是经常在github下载一些开源工具,安装完成之后,提示已损坏,无法打开(如下图),这是因为软件没有签名,被系统阻止运行了
sgr997
2023/10/12
6980
解决macos安装软件后提示已损坏问题
PowerBI 工具提示 在图上显示图
很多人会好奇的是,这个页面如何随着其他的图而变呢?其道理在于它会受到其他图的筛选。
BI佐罗
2020/08/20
2.3K0
jQuery 工具栏提示插件:qTip
qTip 是一个 jQuery 工具栏提示插件,它能够帮你生成漂亮的工具栏提示。该插件支持多种浏览器 ,并且在主流的浏览器上都测试过,并且 qTip 还有 scripting API,使得我们能够通过一些 callback 方法或者属性就能非常扩展它的功能。
Denis
2023/04/14
1.9K0
jQuery 工具栏提示插件:qTip
后渗透工具Koadic实战
渗透测试大致可以分为以下五个阶段:侦察、扫描、获得访问权限、维护访问/持久性、数据渗漏。Koadic是发布于DEFCON上的一个后渗透工具,它可用于以上列举的最后两个阶段,即权限维持和数据渗漏。
FB客服
2019/05/14
1.8K0
后渗透工具Koadic实战
【实用代码】复制内容后弹出提示框教程
效果图 代码 <!-- 复制提醒开始 --> <link rel="stylesheet" href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" /> <script type="text/javascript" src="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.js"></script> <script> document.body.onco
回忆大大
2023/03/18
2K0
【实用代码】复制内容后弹出提示框教程
js单击输入框后弹出提示信息效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <meta name="
欢醉
2018/01/22
11.1K0
js单击输入框后弹出提示信息效果
ubuntu安装docker-compose后运行提示No such file or directory
本人新搞了一台arm架构的vps,安装了ubntu20.0系统,使用apt install -y docker-compose安装了docker-compose后,使用docker-compose命令时却提示出错。
用户2135432
2023/10/21
1.7K0
点击加载更多

相似问题

如何在onclick几秒钟后隐藏tippy js工具提示?

126

在按下时显示工具提示,反应挂钩,几秒钟后隐藏。

12

加载时显示引导工具提示,并在几秒钟后自动隐藏

20

需要在几秒钟后从移动电话点击隐藏工具提示

13

如何优雅地展开jQuery UI工具提示?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文