vector_indexing_suite seems to break the use of return_internal_reference
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Estagnada
- Domínio
- backend-api-design
Direção de pesquisa
Comece com o exemplo vinculado de Boost.Python sobre return_internal_reference e crie o módulo C++ mostrado que expõe Foo, Bar e FooList. Execute a sequência Python que adiciona um segundo Foo e, em seguida, investigue por que a referência Bar retornada anteriormente muda, enquanto foo_ref.get_bar() continua válida. A tarefa estará concluída quando a referência interna permanecer válida após o crescimento do vetor.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
I can create a class Foo that returns an internal reference to a class Bar and everything seems to work just fine. However, when I try and expose a vector of Foo using the vector_indexing_suite, I get some weird behavior. In Python, a reference to the underlying Bar of a Foo in a vector of Foos gets corrupted when a new Foo is appended to the vector.
Since most of the code comes straight out of the Boost Python docs, I assume it should work.
The issue can be replicated by making a few modifications to an example from the Boost Python docs.
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/return_internal_reference.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <vector>
class Bar
{
public:
Bar(int x) : x(x) {}
int get_x() const { return x; }
void set_x(int x) { this->x = x; }
bool operator==(const Bar &other) const { return other.x == x;}
bool operator!=(const Bar &other) const { return !(other == (*this)); }
private:
int x;
};
class Foo
{
public:
Foo(int x) : b(x) {}
// Returns an internal reference
Bar const& get_bar() const { return b; }
bool operator==(const Foo &other) const {return other.b == b;}
bool operator!=(const Foo &other) const { return !(other == (*this)); }
private:
Bar b;
};
using namespace boost::python;
BOOST_PYTHON_MODULE(boosttest)
{
class_<Bar>("Bar", init<int>())
.def("get_x", &Bar::get_x)
.def("set_x", &Bar::set_x)
;
class_<Foo>("Foo", init<int>())
.def("get_bar", &Foo::get_bar
, return_internal_reference<>())
;
class_<std::vector<Foo>>("FooList")
.def(vector_indexing_suite<std::vector<Foo>>())
;
}
Then on the Python side, we get the following.
>>> import boosttest
>>> foolist = boosttest.FooList()
>>> foolist.append(boosttest.Foo(2))
>>> foo_ref = foolist[0]
>>> bar_ref = foo_ref.get_bar()
>>> bar_ref.get_x()
2
>>> foolist.append(boosttest.Foo(3))
>>> bar_ref.get_x()
-572662307
>>> foo_ref.get_bar().get_x()
2
- Linguagem predominante
- C++
- Estrelas
- 537
- Forks
- 223
- Merge médio
- 11h 22min
- PRs com merge (30d)
- 2
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de boostorg/python
-
numpy::from_data calls vector::front and crashes (or has UB) when called with a scalar object Aberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 84/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 64/100
-
BoostDetectToolset-1.90.0.cmake file not found in an include() call in boost_python-config.cmake Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 48/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 25/100
Todas as issues de boostorg/python
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
google/libultrahdr#485 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
godotengine/godot#123776 ·
-
bug
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 60/100
-
good first issue
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
-
good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
ros2/common_interfaces#344 ·