gnuradio c ++ connect self () выбросить bad_weak_ptr - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу вызвать некоторый код в моем конструкторе

connect(self() , 0 , filter , 0);
connect(filter , 0 , self() , 0);

Но я получаю исключение

Завершить вызов после выброса экземпляра 'boost :: exception_detail :: clone_impl>'

Я делаю следующее

my_filter::sptr
my_filter::make(unsigned int interpolation,
            unsigned int decimation) {
auto ptr = gnuradio::get_initial_sptr(new my_filter
                     (interpolation, decimation));
ptr->wire();

return ptr;

}

И метод провода

void my_filter::wire() {
connect(self(),    0, resampler,  0);
connect(resampler, 0, self(),     0);
 }

Но я получаю ошибку

Terminate called after throwing an instance of 'std::invalid_argument'
what():  sptr_magic: invalid pointer!
 what():  tr1::bad_weak_ptr

Как яможно улучшить это?

1 Ответ

0 голосов
/ 20 сентября 2018

Чтение, когда выбрасывается это исключение :

std :: bad_weak_ptr - это тип объекта, выдаваемого в качестве исключения конструкторами std :: shared_ptr, которые принимают std:: слабый_птр в качестве аргумента, когда std :: weak_ptr ссылается на уже удаленный объект.

Скорее всего, ваш self() просто вызывает shared_from_this(), а shared_ptr не указывает на текущийобъект, так как вы находитесь во время строительства, поэтому shared_from_this() должен выдать исключение.

Два исправления используют шаблон двухэтапной инициализации.

std::tr1::shared_ptr<YourCalsss> YourCalsss::Create() // static method
{
    auto result = std::tr1::shared_ptr<YourCalsss>(new YourCalsss);
    result->init(); // inside that you will do a connect
    return result;
}

PS.Я предполагаю, что вы используете C ++ 03 с tr1, поскольку информация об ошибках предоставляет эту подсказку.

...