Что такое умный указатель и когда его следует использовать?
В чем разница между следующим набором указателей? Когда вы используете каждый указатель в рабочем коде, если вообще?
Примеры будут оценены!
scoped_ptr
shared_ptr
weak_ptr
intrusive_ptr
Вы используете повышение в производственном коде?
На практике с C ++, что такое RAII , что такое интеллектуальных указателей , как они реализованы в программе и каковы преимущества использования RAII с интеллектуальными указателями?
C ++ - все о владении памятью
Aka " Семантика собственности "
Ответственность за освобождение этой памяти лежит на владельце куска динамически выделяемой памяти. Таким образом, вопрос действительно становится тем, кому принадлежит память.
В C ++ владение задокументировано по типу,
...Я слышал, что auto_ptr
устарела в C ++ 11. Что является причиной этого?
Также хотелось бы узнать разницу между auto_ptr
и shared_ptr
.
У меня есть такой код:
class RetInterface {...}
class Ret1: public RetInterface {...}
class AInterface
{
public:
virtual boost::shared_ptr get_r() const = 0;
...
};
class A1: public AInterface
{
public:
boost::shared_ptr get_r() const {...}
...
};
Этот код не
...У меня есть что-то вроде shared_ptr t(makeSomething(), mem_fun(&Type::deleteMe))
Теперь мне нужно вызвать функцию в стиле C, которая требует указатель на Type
. Как мне получить его от shared_ptr
?
Я, как и многие другие, добился больших успехов, используя умные указатели для обертывания небезопасных операций с памятью в C ++, используя такие вещи, как RAII и так далее. Однако управление обертыванием памяти проще реализовать, когда у вас есть деструкторы, классы,
...scoped_ptr
не может быть скопирован и удаляется из области видимости. Так что это отчасти ограничено shared_ptr
. Так кажется, кроме случаев, когда вам действительно нужно ограничить операцию копирования, лучше использовать shared_ptr
. Потому что иногда вы не знаете, нужно ли
Просто хотел мнения по вопросу дизайна. Если у вас есть класс C ++, который владеет другими объектами, вы бы использовали умные указатели для достижения этой цели?
class Example {
public:
// ...
private:
boost::scoped_ptr data;
};
Объект 'Owned' не может
...Что является лучшим методом при возвращении умного указателя, например boost :: shared_ptr? Должен ли я по умолчанию вернуть смарт-указатель или базовый необработанный указатель? Я пришел из C #, поэтому я всегда возвращаю умные указатели, потому что это кажется правильным. Как
...Я вспоминаю, что где-то читал, что использование ссылок на интеллектуальные указатели может привести к повреждению памяти. Это просто из-за использования ссылки умного указателя после его уничтожения? Или подсчет ссылок испортился?
Спасибо за разъяснение
Другими словами, как реализация отслеживает количество?
Существует ли поддерживаемый объект типа карты, доступный для всех экземпляров shared_ptr
, ключ которых - адрес указателя, а значение - количество ссылок? Если я должен реализовать shared_ptr
, это первая идея, которая приходит мне
Как писал Скотт Майерс, вы можете воспользоваться расслаблением в системе типов C ++, чтобы объявить clone () и вернуть указатель на фактический объявленный тип:
class Base
{
virtual Base* clone() const = 0;
};
class Derived : public Base
{
... У меня есть простой базовый и производный класс, который я хочу, чтобы оба имели shared_from_this()
.
Это простое решение:
class foo : public enable_shared_from_this {
void foo_do_it()
{
cout<<"foo::do_it\n";
}
public:
virtual function get_callback()
{
return boost::bind(&foo::foo_do_it,shared_from_this());
}
virtual ~foo()
... Я пишу надстройку для Internet Explorer (BHO) и использую умные указатели CComPtr. Интересно: