Форум программистов, компьютерный форум CyberForum.ru

Умный указатель - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
29.07.2013, 14:50     Умный указатель #1
Здраствуйте. Есть такое задание
Задание

Тема: «Работа с указателями. Указатели на функцию.»
Цель: создать свой собственный ”умный указатель”. Применить указатель и протестировать его работу.

Задание:

1) Разобраться с принципами работы “умных указателей” (см. материалы лекции №2). Создать собственноручно написанный ”умный указатель”.

2) Для хранения данных о ноутбуках описать структуру, вид которой приведен ниже (дополнить ее методами доступа к свойствам структуры). Создать массив ”умных указателей” на объекты подготовленного типа.

C++
1
2
3
4
5
6
7
8
9
struct NOTEBOOK{
    struct size         // габаритные размеры
    { 
        float x:
        float y;
        float z;
    };
    float w;    // вес
}
3) Расширить функционал программы:
3.1. Написать функцию, которая сортирует массив структур приведенного типа по весу;
- вх. параметры: массив;
3.2. Написать функцию, которая сортирует массив структур приведенного типа по объему;
- вх. параметры: массив;
3.3. Написать функцию, которая читает данные о ноутбуках из файла note.txt в структуру приведенного вида.
- вх. параметры: имя файла, указатель на заполняемый массив;
- для работы с файлами использовать потоки С++.
3.4. Написать функцию, которая записывает содержимое структуры в файл.
- вх. параметры: массив, указатель на функцию сортировки (можно передавать указатель на любую функцию сортировки), имя выходного файла;
- для работы с файлами использовать потоки С++.
3.5. Написать программу тестирования.




Внимание: применить все свои навыки и возможности, чтобы разрабатываемая программа не „валилась” от неразумных действий пользователя.



В книге которую я прочел нету ничего про умный указатель. Подскажите что это такое и как ним пользоваться.. и что я должен делать в задании... Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 14:50     Умный указатель
Посмотрите здесь:

C++ Умный указатель
C++ умный указатель своими руками
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
Приведение любого двумерного массива к типу указатель на указатель C++
Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
Функция, получающая указатель на обычную функцию, получает указатель на метод класса C++
C++ Функция, возвращающая умный указатель
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21657 / 10383 / 1687
Регистрация: 12.02.2012
Сообщений: 17,320
29.07.2013, 16:54     Умный указатель #2
Почитай это
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 17:40     Умный указатель #3
Цитата Сообщение от Ronan Посмотреть сообщение
Создать массив ”умных указателей” на объекты подготовленного типа.
cтранноватое задание, если я ничего не путаю надо создать аналог smart_ptr, но вроде как их нельзя засовывать в массивы вектора и т.д

Добавлено через 2 минуты
суть "умного указателя" - уйти от утечек памяти, когда по указателю создаем объект в какой то ф-ции, а потом забываем его удалить, после выхода из ф-ции "умный указатель" чистит за собой память, а насчет их копирования есть 2 варианта, не копировать их вообще, или передавать значение указателя копии, а самому эту область памяти не чистить

Добавлено через 1 минуту

Не по теме:

ой аналог auto_ptr

gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
29.07.2013, 17:41     Умный указатель #4
Цитата Сообщение от aLarman Посмотреть сообщение
вроде как их нельзя засовывать в массивы вектора и т.д
Можно, если эти указатели можно копировать и\или перемещать

Добавлено через 48 секунд
Для массива вообще нужен только конструктор по умолчанию
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 17:44     Умный указатель #5
Цитата Сообщение от gray_fox Посмотреть сообщение
Можно, если эти указатели можно копировать и\или перемещать
так я не спорю, просто сама концепция "умных указателей" не позволяет этого делать
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
29.07.2013, 17:46     Умный указатель #6
aLarman, shared_ptr/unique_ptr?
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
29.07.2013, 17:56     Умный указатель #7
Цитата Сообщение от aLarman Посмотреть сообщение
просто сама концепция "умных указателей" не позволяет этого делать
Концепция "умных указателей"? То, что у auto_ptr проблемы с этим - так это проблемы auto_ptr, а не интелектуальных указателей.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.07.2013, 18:01     Умный указатель #8
примерно вот так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <functional>
 
template <class T>
class unique_ptr
{
    using pointer = T*;
    using reference = T&;
    using Deleter = std::function<void(pointer)>;
 
    pointer ptr;
    Deleter deleter;
 
    struct default_deleter
    { void operator () (pointer p) { delete p; } };
 
public:
    unique_ptr() noexcept : ptr(nullptr), deleter(default_deleter()) {}
 
    unique_ptr(pointer p, Deleter del = default_deleter()) : ptr(p), deleter(del) {}
 
    unique_ptr(const unique_ptr&) = delete;
 
    unique_ptr(unique_ptr &&x) noexcept : ptr(x.ptr), deleter(x.deleter)
    {
        x.ptr = nullptr;
    }
 
    ~unique_ptr()
    {
        deleter(ptr);
    }
 
    unique_ptr& operator = (const unique_ptr&) = delete;
 
    unique_ptr& operator = (unique_ptr &&x) noexcept
    {
        ptr = x.ptr;
        x.ptr = nullptr;
        deleter = x.deleter;
        return *this;
    }
 
    reference operator * () const
    {
        return *ptr; // !!! *nullptr
    }
 
    pointer operator -> () const noexcept
    {
        return ptr;
    }
 
    pointer get() const noexcept
    {
        return ptr;
    }
 
    void reset(pointer p = nullptr) noexcept
    {
        this->~unique_ptr();
        ptr = p;
    }
 
    pointer release() noexcept
    {
        pointer p = ptr;
        ptr = nullptr;
        return p;
    }
};
 
struct Foo
{
    ~Foo() {std::cout << "~Foo\n";};
};
 
int main()
{
    unique_ptr<Foo> p1( new Foo );
    unique_ptr<Foo> p2(new Foo[10], [](Foo *p){delete[] p;});
    return 0;
}
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
29.07.2013, 18:44     Умный указатель #9
Olivеr,
C++
1
unique_ptr(unique_ptr &&x) noexcept : ptr(std::move(x.ptr)), deleter(std::move(x.deleter))
C++
1
2
ptr = std::move(x.ptr);
deleter = std::move(x.deleter);
gray_fox
29.07.2013, 18:46
  #10

Не по теме:

Цитата Сообщение от Olivеr Посмотреть сообщение
reference operator * () const
Можно сделать noexcept

Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.07.2013, 18:51     Умный указатель #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Olivеr,
C++
1
unique_ptr(unique_ptr &&x) noexcept : ptr(std::move(x.ptr)), deleter(std::move(x.deleter))
C++
1
2
ptr = std::move(x.ptr);
deleter = std::move(x.deleter);
а чем тогда объект x будет удалять ptr(nullptr) в своем деструкторе?

Добавлено через 4 минуты
вот что я имел в виду
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Foo
{
    std::function<void()> f;
    Foo()
    {
        f = [](){ std::cout << "~Foo\n"; };
    }
 
    Foo(Foo &&x) : f(std::move(x.f)) {}
 
    ~Foo() { f(); }
};
 
int main()
{
    Foo a;
    Foo b( std::move(a) );
    return 0;
}
~Foo
terminate called after throwing an instance of 'std::bad_function_call'
what(): bad_function_call
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
29.07.2013, 18:55     Умный указатель #12
Olivеr, move конструктор, который на самом деле делает копию? Слишком нелогично, не находите?

C++
1
unique_ptr(unique_ptr&& u) noexcept;
Effects: Constructs a unique_ptr by transferring ownership from u to *this. If D is a reference type,
this deleter is copy constructed from u’s deleter; otherwise, this deleter is move constructed from u’s
deleter. [ Note: The deleter constructor can be implemented with std::forward<D>. —end note ]
Postconditions: get() yields the value u.get() yielded before the construction. get_deleter()
returns a reference to the stored deleter that was constructed from u.get_deleter(). If D is a
reference type then get_deleter() and u.get_deleter() both reference the same lvalue deleter.
C++
1
~unique_ptr();
Effects: If get() == nullptr there are no effects. Otherwise get_deleter()(get()).
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.07.2013, 19:06     Умный указатель #13
ForEveR, тогда добавить проверку в деструктор что ли?
C++
1
2
3
4
5
6
7
8
9
10
    unique_ptr(unique_ptr &&x) noexcept : ptr(x.ptr), deleter(std::move(x.deleter))
    {
        x.ptr = nullptr;
    }
 
    ~unique_ptr()
    {
        if (ptr)
            deleter(ptr);
    }
Добавлено через 55 секунд
и, кстати, перемещение указателя не устанавливает его в nullptr
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
29.07.2013, 19:07     Умный указатель #14
Olivеr, Именно так сделано в unique_ptr, да. Перемещение указателя не устанавливает конечно (по сути будет в любом случае копия указателя), однако выглядит это несколько логичнее, если мы пишем move конструктор - все члены должны быть именно перемещены (используя std::move).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2013, 20:53     Умный указатель
Еще ссылки по теме:

C++ Как правильно удалять выделенную память под указатель на указатель?
Умный указатель и динамический массив C++
Объяснить работу функции, возвращающей указатель на указатель на char C++
C++ Указатель на указатель, функции для создания новых массивов?
C++ Декоратор и умный указатель

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12085 / 6946 / 782
Регистрация: 27.09.2012
Сообщений: 17,230
Записей в блоге: 2
Завершенные тесты: 1
29.07.2013, 20:53     Умный указатель #15
Вот еще один пример: http://ideone.com/ztKaAd
Yandex
Объявления
29.07.2013, 20:53     Умный указатель
Ответ Создать тему
Опции темы

Текущее время: 14:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru