информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Линуксовый ботнет, распространяющийся... 
 Конец поддержки Internet Explorer 
 Рекордное число уязвимостей в 2021 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] auto_ptr, оператор присваивания и конструктор копирования 23.03.09 12:37  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Решил реализовать свой собственный auto_ptr в качестве упражнения (ибо я не большой спец по C++, поэтому решил начать с малого). Сразу возникли непонятные моменты.

Моя реализация:

template<typename T>
class auto_ptr
{
	T *object;

public:
	explicit auto_ptr(T *p = 0) : object(p) {}

	template<typename K>
	auto_ptr(auto_ptr<K> &p) : object(static_cast<T*>(p.release()))
	{
	}

	template<typename K>
	auto_ptr& operator=(auto_ptr<K> &p)
	{
		object = static_cast<T*>(p.release());
		return *this;
	}


	auto_ptr& operator=(auto_ptr &p)
	{
		object = p.release();
		return *this;
	}


	~auto_ptr()
	{
		delete object;
	}


	T& operator*() const {return *object;}
	T* operator->() const {return object;}

	T* release() {T* t = object; object = 0; return t;}
	void reset() {delete object; object = 0;}
};

---

Я не вижу никаких особых недостатков моего подхода. Однако я смотрю на реализацию в STL и не понимаю - зачем им auto_ptr_ref? Просто не вижу в нем смысла. Буду признателен, если кто-либо мне это объяснит.

Так же по ходу реализации auto_ptr возникли непонятности с оператором присваивания и конструктором копирования. Как видно из кода, мне пришлось реализовывать два оператора присваивания - теплейтный и «обычный». Это связано с тем, что компилятор (VC++ 2005 - если в новых версиях это иначе, прошу сообщить) генерит дефолтовый operator=, и игнорирует мой темплейт. Это вполне есественно - зачем инстанцировать темплейт, когда уже определена конкретная функция? Однако возникает непонятка: почему же он тогда инстанцирует темплейтный копирующий конструктор, а не использует сгенерированный дефолтовый, ведь и тот и другой генерируются по умолчанию?

В общем, я лично в замешательсве.
На первый вопрос ответить довольно легко 23.03.09 22:20  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Я не вижу никаких особых недостатков моего подхода. Однако
> я смотрю на реализацию в STL и не понимаю - зачем им
> auto_ptr_ref? Просто не вижу в нем смысла. Буду
> признателен, если кто-либо мне это объяснит.
На первый вопрос ответить довольно легко
http://lmgtfy.com/?q=auto_ptr_ref

> что компилятор (VC++ 2005 - если в новых версиях это иначе,
> прошу сообщить) генерит дефолтовый operator=, и игнорирует
9-я (2008-я) SP1 поступает так же

> мой темплейт. Это вполне есественно - зачем инстанцировать
> темплейт, когда уже определена конкретная функция? Однако
> возникает непонятка: почему же он тогда инстанцирует
> темплейтный копирующий конструктор, а не использует
> сгенерированный дефолтовый, ведь и тот и другой
> генерируются по умолчанию?
Вот с этим сложнее. Чувствую нужно очень внимательно читать главы 12.8 и 14.8.2 стандарта. Проще забить

> В общем, я лично в замешательсве.
Ужос 23.03.09 23:09  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 23.03.09 23:30  Количество правок: 1
<"чистая" ссылка>
> На первый вопрос ответить довольно легко
> http://lmgtfy.com/?q=auto_ptr_ref
Да, мне стыдно, не знаю что со мной произошло :-(
В общем, почитал. Ужос. Грязные хаки. Подумалось вдруг: если уж хаки применять, то можно было бы определить копирующий конструтор c константной ссылкой, а внутри его конст-кастить указатель. Вроде то же на то же. Хотя признаться я до конца так и не понял каким образом он так ловко находит сам собой этот auto_ptr_ref. Видимо (очевидно), я не очень хорошо понимаю правила приведения типов в C++.

В общем спасибо за помощь.
Const_cast-ить не надо. Можно просто объявить mutable 24.03.09 00:08  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> копирующий конструтор c константной ссылкой, а внутри его
> конст-кастить указатель. Вроде то же на то же. Хотя
Но тогда будет работать код, который работать не должен:
http://www.josuttis.com/libbook/auto_ptr.html

#include <memory>

void
f(auto_ptr<int> p) { // Твой auto_ptr
	*p = 24;
}

void
g(std::auto_ptr<int> p) {
	*p = 24;
}

void
main() {
	const auto_ptr<int> p1(new int);
	const std::auto_ptr<int> p2(new int);
	*p1 = 42;
	*p2 = 42;
	f(p1);
	g(p2)
}

---

> признаться я до конца так и не понял каким образом он так
> ловко находит сам собой этот auto_ptr_ref. Видимо
> (очевидно), я не очень хорошо понимаю правила приведения
> типов в C++.

> В общем спасибо за помощь.
Ага. И таки да, это хак. Еще один забавный хак - бустовый unspecified_boolean_type в умных указателях.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach