Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2015, 02:22   #21
FIDE
Заблокирован
 
Регистрация: 02.08.2014
Сообщений: 30
По умолчанию

Цитата:
при этом другому смарту он просто указатель нацеливает на тот же адрес.
Вот! Точно! Наконец-то дошло до меня. Важная фраза! Спасибо вам огромное!!! Ведь указатель везде на одну и ту же переменную указывает! А то я вообще думал, что придется массив заводить чтоб хранить для каждого нового указателя кол-во копий...
З.Ы С меня + в репу будут просто сейчас не добавляет...("Вы должны добавить отзыв еще кому-то прежде чем оставить отзыв _Bers")
FIDE вне форума Ответить с цитированием
Старый 10.03.2015, 05:54   #22
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
Ведь указатель везде на одну и ту же переменную указывает!
Т.е. ты решил сделать то, что даже не представлял? - я вот думаю, что ты не только не использовал умные указатели, но даже не прочитал про них ни разу.

Цитата:
Ну представьте себе умный указатель на массив, и последствия освобождения его с помощью просто delete
Дак ты пишешь умный указатель на массив? - иначе "представь себе умный указать не на массив и последствия ... "
Наверняка, дело не только в delete. В буста умные указатели на массив - это особые типы (shared_array, scoped_array и может быть еще что-то).

Вобще про проблемы таких велосипедов у Маерса целый раздел (только про смартпоинтеры). Про массивы он там тоже упоминает, но примерно так: "это сложно и ненужно, т.к. есть вектора и прочее". У него там есть несколько реализаций вроде бы, но в основном он описывал что-то типа auto_ptr, который уже из стандарта выпилили даже. Про проблемы с потоками тоже там вроде было...
rrrFer вне форума Ответить с цитированием
Старый 10.03.2015, 11:01   #23
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
представь себе умный указать не на массив и последствия
емнип, undefined behavior в обоих случаях
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 10.03.2015, 19:16   #24
FIDE
Заблокирован
 
Регистрация: 02.08.2014
Сообщений: 30
По умолчанию

Переделал...
Код:
#include <iostream>
#include <conio.h>
#include <vld.h>//Visual Leak Detector для поиска утечек памяти

using namespace std;

class Temp
{
	int TEMP;    
public:
	Temp(){TEMP=25;}
	void TempFunction(){cout<<"TEMP = "<<TEMP<<"\n";} 
	void TempSet(int T){TEMP=T;}
};

template <typename T>
class smart_ptr
{
private:
	int* copy;
	T* ptr;
public:
	smart_ptr(T* pointer)
	{
		copy=new int(1);
		ptr=pointer;
	}
	smart_ptr(smart_ptr& obj)
	{
		(*obj.copy)++;
		ptr=obj.ptr;
		copy=obj.copy;
	}
	smart_ptr& operator=(smart_ptr& obj)
	{
		(*obj.copy)++;
		ptr=obj.ptr;
		copy=obj.copy;
		return *ptr;
	}
	~smart_ptr()
	{
		if (*copy==1)
		{
			cout<<"Destructor!"<<endl;
			delete copy;
			delete ptr;
		} else 
		{
			(*copy)--;
			cout<<"Destructor copy!"<<endl;
		}
	}
	T& operator*()
	{
		return *ptr;
	}

	T* operator->()
	{
		return ptr;
	}

};

int main()
{
	smart_ptr <Temp> ptr1(new Temp);
	smart_ptr <Temp> ptr2=ptr1;
	smart_ptr <Temp> ptr3=ptr1;
	smart_ptr <Temp> ptr4=ptr1;
	ptr2->TempSet(123);
	ptr1->TempFunction();
	getch();
	return 0;
}
FIDE вне форума Ответить с цитированием
Старый 11.03.2015, 12:49   #25
alusov
Новичок
Джуниор
 
Регистрация: 11.03.2015
Сообщений: 1
По умолчанию

Привет,

Хорошая реализация. Но нужно поправить оператор присваивания =. У Вас текущий указатель может ссылаться на другой объект типа Т. Поэтому в нем необходимо уменьшить счетчик ссылок (*copy)--, и сделать очистку памяти если счетчик в еденице окажется. Для иллюстрации проблемы подумайте что будет если бы был такой код:

smart_ptr <Temp> ptr1(new Temp);
smart_ptr <Temp> ptr2(new Temp);
ptr2=ptr1;

Последний раз редактировалось alusov; 11.03.2015 в 12:59.
alusov вне форума Ответить с цитированием
Старый 11.03.2015, 13:33   #26
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от alusov Посмотреть сообщение
Хорошая реализация.
нет, она - не хорошая.

1. конструкторы копии принимают только мутабельные объекты.
2. нет конструкторов для временных объектов.
3. нет методов для работы с константными объектами.

4. методы доступа ничего не проверяют,
и никак не предупреждают программиста о возможных неисправностях.
например - о попытке доступа к несуществующему объекту.

5. оператор присваивания вы уже итак упомянули - баг.

6. отсутствуюет защита thread-safe
7. отсутствуют exception-гарантии.

8. счетчик ссылок реализован имеет тип int,
а должен быть size_t, или unsigned

9. смарт не способен вызвать корректный диструктор для полиморфного типа.

10. счетчик реализован не оптимально:
двойная аллокация, хотя можно было бы сделать только 1 аллокацию.

11. отсутствуют exception-гарантии при захвате ресурса

12. отсутствует возможность посетить кастомную функцию удаления ресурса.

13. отсутствует возможность узнать количество ссылок.
14. отсутствует возможность узнать пуст ли смарт-поинтер.

15. не реализован swap.

16. не реализованы операции сравнения двух смарт-поинтеров.

Этот список можно продолжать ещё долго.
Конечно не стоит ожидать соотвествия со стандартным аналогом от новичка.

Однако пункты: 1 - 5, 8, 13 - 14 - обязательный минимум.
_Bers вне форума Ответить с цитированием
Старый 11.03.2015, 21:17   #27
FIDE
Заблокирован
 
Регистрация: 02.08.2014
Сообщений: 30
По умолчанию

Цитата:
4. методы доступа ничего не проверяют,
и никак не предупреждают программиста о возможных неисправностях.
например - о попытке доступа к несуществующему объекту.
А такой баг может случиться? Выходит нужно просто добавит проверку в операторах * и ->?
Цитата:
2. нет конструкторов для временных объектов.
3. нет методов для работы с константными объектами.
Временные?А можно пример?
А какие методы нужны для константных объектов?
FIDE вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильна ли такая реализация списка из указателей на базовый класс? Archet Общие вопросы C/C++ 14 18.01.2012 16:08
АТД: Реализация списка с использованием указателей Suslik963 Помощь студентам 1 17.11.2010 10:06
Ищу умных людей по с++ Maver1k[Kiev] Свободное общение 3 24.03.2010 10:22
прошу помощи у умных людей... lesimel C++ Builder 12 21.12.2009 09:09