Como usar std::function sem causar "caca" no código? [RESOLVIDO]

1. Como usar std::function sem causar "caca" no código? [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 10/12/2022 - 11:42h

Olá, eu tava usando std::function passado como argumento dentro de uma classe e ai aconteceu bugs horríveis que são simplesmente impossossíveis de saber o porquê ocorreu.

Por exemplo:
class A {
std::function<void(int *p)> callback;
public:
A(std::function<void(int *p)> c) {
callback = c;
}
};

É mais ou menos assim a classe que armazena o callback. Acontece que o seguinte: se eu crio a variável do tipo A dentro de outra classe qualquer, e armazeno o A num std::vector, o programa simplesmente fecha com falha de segmentação. Vou ao gdb e não tem nada cara, só mostra uns '??'. Mas se eu removo o código onde tá adicionando o A, ele funciona normalmente. Também funciona se eu transformar o callback passado pro A numa função static dentro da outra classe, mas ai é uma baita gambiarra.

O que eu faço nesse caso? Já tentei de tudo mas ainda não reduzi o meu código pra ter um exemplo mínimo (vou fazer isso daqui a pouco).
Alguma ideia?

https://nerdki.blogspot.com/ acessa ai, é grátis


  


2. Re: Como usar std::function sem causar "caca" no código? [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 10/12/2022 - 15:18h

Deixa pra lá, acabei de ver aqui que o tal std::function é uma feiosa gambiarra padrão do c++.

Vou usar o velho estilo do C que funciona de verdade e não causa raiva em minha pessoa.

Obrigado.


https://nerdki.blogspot.com/ acessa ai, é grátis


3. Re: Como usar std::function sem causar "caca" no código? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/12/2022 - 15:45h

Salve, SamL.

Fechou o tópico no mesmo dia? Pra que tanta pressa, especialmente em dezembro, que é um mês em que todo mundo está numa correria para entregar todas as metas, participar de todas as confraternizações, fazer todas as compras, e participar dos eventos de tempo do Advento?

Brincadeira. Ou melhor, parcialmente brincadeira: apesar de estar respondendo com uma semana de atraso — e é óbvio que ninguém precisaria de esperar tanto tempo por uma resposta —, eu comecei a escrever a resposta logo no dia seguinte à sua pergunta, mas não consegui concluí-la por causa do monte de coisas para fazer, ou por estar esgotado após fazer uma parte delas — até porque tal resposta não é só o que está no texto desta mensagem aqui, mas um bocado de tempo escrevendo códigos de teste e lendo documentação para auxiliar numa eventual resposta.


O lance de std::function é generalizar a ideia de ponteiros de função que possam ser usados como callbacks, a fim de permitir o uso de outras construções sintáticas que porventura sejam mais flexíveis. No caso do C++, essas estrutura incluem, além de funções, também objetos-funções (functors, que são objetos de classes que possuem funções-membros com sobrecarga do operador (), de invocação de função) e funções lambda (que são casos particulares, numa sintaxe supostamente mais simples, de functors anônimos, declarados in-place), e é particularmente mais interessante quando usada com templates.


Você pode dar um exemplo do código que você tentou fazer usando std::function e que deu problema? Eu vi que você falou em ter algo parecido com um vetor de callbacks, e fiquei aqui matutando se teria alguma coisa a ver com uma possível invalidação de ponteiros entre o tempo da atribuição do objeto de callback (seja ele função, functor, lambda conhecido ou lambda anônimo) e seu uso, mas eu não consegui, mesmo tentando deliberadamente, criar um caso de uso em que tal invalidação acontecesse.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


4. Re: Como usar std::function sem causar "caca" no código? [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 17/12/2022 - 17:59h


paulo1205 escreveu:

Salve, SamL.

Fechou o tópico no mesmo dia? Pra que tanta pressa, especialmente em dezembro, que é um mês em que todo mundo está numa correria para entregar todas as metas, participar de todas as confraternizações, fazer todas as compras, e participar dos eventos de tempo do Advento?

hahahaha Paulo, aproveito pra te desejar feliz natal super antecipado, é que não sei quando tu acessa o vol e ai fica difícil pegar no dia do natal.


O lance de std::function é generalizar a ideia de ponteiros de função que possam ser usados como callbacks, a fim de permitir o uso de outras construções sintáticas que porventura sejam mais flexíveis. No caso do C++, essas estrutura incluem, além de funções, também objetos-funções (functors, que são objetos de classes que possuem funções-membros com sobrecarga do operador (), de invocação de função) e funções lambda (que são casos particulares, numa sintaxe supostamente mais simples, de functors anônimos, declarados in-place), e é particularmente mais interessante quando usada com templates.

Não precisa mais, Paulo, eu acebei refazendo todo o código e removendo os callbacks de dentro das classes. Acho que tava acontecendo porque eu criei a função dentro de classes, no escopo do main não acontece nada de mais. Mesmo assim, foram bugs cabeludos esses, nem o gdb sabia onde acontecia a falha de segmentação, mas ao remover os std::function tudo funcionava normal.

Dou como resolvido esse tópico. Então, até a próxima!

https://nerdki.blogspot.com/ acessa ai, é grátis






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts