当我使用 operator[] 时列出导致错误的项目

Posted

技术标签:

【中文标题】当我使用 operator[] 时列出导致错误的项目【英文标题】:List get item causing error when I use operator[] 【发布时间】:2016-12-10 05:03:47 【问题描述】:

我使用 boost 1.57 和 boost python。这是我的代码示例:

list records = call_method<list>(...);
object attr = records.attr("__len__")();
int n = extract<long>(attr);
for (int i = 0; i < n; ++i)

    records[i];
//here cause error

在这个列表中,我存储了一些包含 Python 字符串的元组。看来records[i]超出这个范围会调用Py_DECREF并导致错误,那么我应该怎么做才能从item中获取数据呢?

【问题讨论】:

records[i]; 应该做什么? list 是什么?我假设不是std::list,因为它没有随机访问权限。错误是什么? list 是 boost::python::list。首先我使用boost::python::call_method&lt;std::list&lt;std::tuple&lt;std::string,std::string&gt; &gt; &gt;(...) 获得结果但导致程序崩溃。然后我发现它应该使用boost::python::list 来保留结果。但是,如果我写boost::python::object obj=records[i]~object_base() 中写出Py_DECREF,当它超出循环范围时也会崩溃。那我应该怎么做才正确呢? 【参考方案1】:

似乎某些操作符[]可能会导致这些现象,所以我必须避免它并使用以下解决方案:

#include <boost/python/stl_iterator.hpp>

        list records = call_method<list>(...);
        stl_input_iterator<tuple> end;
        for (stl_input_iterator<tuple> itr(records); itr != end;++itr)
        
            auto record = *itr;
            std::string tick = call_method<std::string>(record.ptr(), "__getitem__", 0);
            ...
        

【讨论】:

以上是关于当我使用 operator[] 时列出导致错误的项目的主要内容,如果未能解决你的问题,请参考以下文章

已添加具有相同键的项-查询中没有重复列

“已超出最大错误数”但未列出错误或警告

[解决问题]未知的生成错误“已添加了具有相同键的项”(SVN进行更新后冲突,冲突解决等操作导致,并且无法定位到代码)

无法删除数组项,错误的项总是被删除

Boost interprocess flat_map operator[] 编译错误

列出表导致“数据库中的 CREATE TABLE 权限被拒绝”ASP.NET - MVC4