Kirill
Звучит как неправильное использование shared_ptr.
Kirill
shared_ptr владеет объектом, на который указывает.
Kirill
Если объект есть в векторе, значит, им владеет вектор.
Rafael 🌵
действительно, наверное стоит отказаться от понта в этом месте
Rafael 🌵
а стоит ли вообще использовать shared_ptr для рекурсивных функций?
🦥Alex Fails
Kirill
Maxim
безусловно
🦥Alex Fails
Rafael 🌵
Maxim
ссылку можно
Rafael 🌵
Rafael 🌵
так какой из умных указателей для рекурсий юзать? или что вообще юзать?
🦥Alex Fails
Нафигачь простой образец, чтобы можно было врубиьься в контекст
Maxim
то есть ссылки тебе недостаточно?
Maxim
или что?
🦥Alex Fails
Rafael 🌵
тогда сначала вопрос, кто-то знает про redis protocol?
🦥Alex Fails
Очень знакомое слово)
Vladislav
Vladislav
Kirill
🦥Alex Fails
boost::shared_vector
🦥Alex Fails
Мне на конфе в Яндексе его советовали
Rafael 🌵
https://gist.github.com/Fl0pZz/cd6209e8716731cfa67abac5dd31acb8
тут юзается boost.variant
Rafael 🌵
просто я вообще хз как это должно быть правильно сделано
Vladislav
Не понял.
https://gist.github.com/winger/f11aa3fec13f2252ecd53912046eb32f
Rafael 🌵
Kirill
А, ну это понятно.
Kirill
Я уже перетрудился сегодня.
Rafael 🌵
вот, немного перевормулирую вопрос:
у менят есть вектор, который используется как буфер (надо минимизировать копирования), и у меня есть объекты, которые содержат в себе ссылки на некоторые элементы буфера, так вот хочется чтобы внутри вектора был некоторый счетчик ссылок на его элементы
Gleb
Gleb
Счетчики нужны для удаления уже ненужных объектов, удалять потом из буфера отдельные элементы плохая идея
Rafael 🌵
Чтобы?
резонный вопрос, действительно
Gleb
Такого рода буферы, как правило, живут очень долго, если я понял правильно. Выделил, огородил локом и вперед. Вообще отдавать во вне указатели на части вектора это лютая протечка абстракции
Rafael 🌵
Не, я неверно сказал
Rafael 🌵
Сейчас правильно опишу ситуацию
🦥Alex Fails
Можно отдавать не сырой ук-ль. А объект, инкапсулрующий его
🦥Alex Fails
Вообще, в COM (которая Object Model) используется такая шняга
🦥Alex Fails
Там все классы реализуют методы AddRef() и Release()
🦥Alex Fails
AddRef возвращает ссылку на этот же класс, увеличивая его внутренний счетчик ссылок, Release() - усеньшает на 1. Если счетчик равен 0, то Release убивает объект класса
🦥Alex Fails
Зафигачь сначала шаблонный класс с этими двумя методами, потос перегрузи оператор присваивания, ctor копирования (в нем делай AddRef()), переноса и dtor (в нем Release)
Rafael 🌵
Вот что происходит у меня в программе:
1) я получаю данные из сокета в виде обычной строчки
2) есть буфер элементов, содержащие в себе ссылки на куски сырых данных из этой входной строки(так я минимизирую копирования), дальше я уже что-то там делаю с этими элементами
Rafael 🌵
🦥Alex Fails
Rafael 🌵
Ох ладно, сделаю через обычный указатель, к черту эти понты
Rafael 🌵
Copy-On-Write делай
Cow не нужен, потому что изменения происходят только при дисереализацти данных, дальше они нигде не изменяются
🦥Alex Fails
🦥Alex Fails
Мне тут идея пришла. Чо если отправлять уведомление всем, кто запросил птр на буфер, о том, что буфер изменился?
Rafael 🌵
Rafael 🌵
И чет это больше чем дофига дорого
Ned
есть ли способ статически прилинковать динамическую либу?
Ned
то бишь .so
Kirill
Нет
Kirill
Формат у них разный
Ned
есть переформатчики?
Ned
под винду сейчас спрашиваю
Kirill
В разделяемых библиотеках сборка идет в режиме PIC (Position Independent Code).
Kirill
Нет разницы
Ned
ибо под линь нашёл statifier.sourceforge.net
Kirill
Ну, это не совсем то
Kirill
Это, скорее, упаковка умная.
Kirill
Т.к. с файлом .so ничего особо не сделаешь.
ඞ
Это люди
ඞ
Хотя пойду лучше в супу
Ned
стоп
Ned
а как же явно вызвать ld.so?
Ned
в случае с линем (даже в манах пишется), это так и работает. она линкует (пусть и не навеки) и загружает прогу
ඞ
Я в супу написал, но что-то она неживая.
Ned
если возникает double free or corruption, дело в операторе =, верно?
🦥Alex Fails
Может быть и в нем
Ned
#include <iostream>
#include <matrixlib.h>
int main(){
Matrix<int> A(10,11);
A = Matrix<int> (5,6);
}
`
Ned
в таком коде
Ned
в конструкторе резервируется память, в деструкторе дилит
Ned
надо определить оператор =, верно?
🦥Alex Fails
Да