LINUX.ORG.RU

[C++][NDK] Умные указатели

 ,


1

3

Давно не писал ничего серьезного на С++, но сейчас возникла необходимость.
Код - под андроид NDK. Какую бы отдельную небольшую реализацию умных указателей вы посоветовали использовать? Требуется поведение, аналогичное сборщику мусора: после удаления последнего указателя объект должен разрушаться.
Boost не подходит, слишком большой, std::auto_ptr имеет не ту функциональность, std::tr1::shared_ptr в NDK нет.

★★★★★

Последнее исправление: note173 (всего исправлений: 1)

Зачем?!... Неужели сложно самому delete делать, там где это надо?

А вообще гугл в помощь по словам «reference counting»

anonymous
()

а сколько у буста получаются зависимости в итоговом бинарнике?

thevery ★★★★
()

Мы в Андроиде пользуемся внутренними классами: RefBase, sp (strong pointer), wp (weak pointer). Много вкусного лежит в $AFS/frameworks/base/include/utils, линковать с libutils.so. К сожалению, эти классы платформозависимы.

Dendy ★★★★★
()

Буст-то может и большой, но умные указатели у него - это header-only либа, и не такая уж и большая.

ratatosk
()
Ответ на: комментарий от anonymous

Зачем?!... Неужели сложно самому delete делать, там где это надо?

Да вообще сразу на асме писать надо, чего уж там.

ratatosk
()

> Boost не подходит, слишком большой

Так возьмите от буста только нужное. Вам, вероятно, одного хидера хватит.

andreyu ★★★★★
()
Ответ на: комментарий от yoghurt

Там, где я их использовал, было однопоточное приложение, так что обошлись без них. ;-)

trex6 ★★★★★
()
Ответ на: комментарий от andreyu

Он тянет за собой другие части boost, в итоге подтягивается код с исключениями, которые на stlport не поддерживаются. Можно их включить, но тогда платформа будет ограничена версией 2.3, что мне совсем не нужно.

note173 ★★★★★
() автор топика
Ответ на: комментарий от note173

boost::atomic есть абсолютно отдельный от буста

у него там даже пример есть с reference counting

ckotinko ☆☆☆
()
Ответ на: комментарий от note173

Ок. У меня дома вроде бы валялась реализация. Попробую вечером скинуть.

trex6 ★★★★★
()
Ответ на: комментарий от note173

> Он тянет за собой другие части boost, в итоге подтягивается код с исключениями, которые на stlport не поддерживаются. Можно их включить, но тогда платформа будет ограничена версией 2.3, что мне совсем не нужно.

А какми-либо дефайнами это не отключается?

andreyu ★★★★★
()

Все-таки использовал boost. Пришлось сделать небольшой хак, но вроде как работает.

Получилась такая обертка для включения в код умных указателей:

//boost_memory.h

#include <exception>

namespace std
{
    struct bad_alloc : public exception{bad_alloc (){}};
    struct bad_cast : public exception{bad_cast (){}};
}

namespace boost
{
    inline void throw_exception(std::exception const&) {}
}

#include <shared_ptr.hpp>
#include <weak_ptr.hpp>

using boost::shared_ptr;
using boost::weak_ptr;

В Android.mk:

LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC
LOCAL_C_INCLUDES = $(LOCAL_PATH)/boost

note173 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.