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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
#1

Паттерн "Одиночка" и динамическая память - C++

28.05.2012, 22:01. Просмотров 829. Ответов 13
Метки нет (Все метки)

Приветствую всех! Набросал паттерн "Одиночка", при конструировании есть динамическая память, также статическое поле (имеется в виду static_field, а не сам instance). Подобный объект нужно будет внести в другую, намного более сложную задачу. Нет ли в реализации ничего опасного/плохого? Знаю, что если код компилируется и работает, то это еще ничего не значит, так как могут быть проблемы, проявляющиеся незакономерно (например, с памятью).

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
// ---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream>
#include <list>
#pragma hdrstop
 
#include <tchar.h>
 
#pragma argsused
#include "func.h"
 
using namespace std;
 
// ---------------------------------------------------------------------------
class Singleton {
public:
 
    int get_amount() {
        return amount;
    }
 
    static Singleton* get_inst();
 
    static int static_field;
    int *p;
 
    ~Singleton() {
        delete[]p;
    }
 
    void show_array();
 
private:
    static Singleton* volatile inst;
    int amount;
 
    Singleton() {
        amount = 5;
        p = new int[amount];
        for (int i = 0; i < amount; i++) {
            p[i] = 10 * i;
        }
    }
};
 
Singleton* volatile Singleton::inst = NULL;
int Singleton::static_field = 90;
 
Singleton* Singleton::get_inst() {
    if (inst == 0) {
        if (inst == 0) {
            Singleton* volatile temp = new Singleton();
            inst = temp;
        }
    }
    return inst;
}
 
void Singleton::show_array() {
    cout << "Array" << endl;
    for (int i = 0; i < amount; i++) {
        cout << p[i] << endl;
    }
}
 
int _tmain(int argc, _TCHAR* argv[]) {
    cout << "amount: " << Singleton::get_inst()->get_amount() << endl;
    cout << "static_field: " << Singleton::get_inst()->static_field << endl;
    Singleton::get_inst()->show_array();
    Singleton::get_inst()->~Singleton();
    system("pause");
    return 0;
}
// ---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 22:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Паттерн "Одиночка" и динамическая память (C++):

Паттерн "Одиночка" и конструктор копии с оператором присваивания - C++
Здравствуйте! Подскажите пожалуйста с вопросом. Мне необходимо реализовать паттерн &quot;Одиночка&quot;. Необходимо ли перегружать конструктор...

Паттерн "Итератор" для шаблонного класса "Словарь" - C++
Препод дал задание сделать шаблонный словарь и реализовать для него иттератор. Сделал словарь, но как работать с иттератором я понятия не...

Singleton. Одиночка. Паттерн - C++
Как реализовать паттерн Singleton на C++? Делаю так: Заголовочный файл: class Play { private: Play(void); ~Play(void);

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Курсовая работа "Паттерн Компоновщик. Расчет стоимости оборудования исходя из его составных частей." - C++
Предлагаю ознакомиться с моей курсовой работой на данную тему. С заинтересованными обсудим на каких условиях я предоставлю все файлы...

13
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
28.05.2012, 22:03 #2
ну можно для разнообразия деструктор сделать виртуальным
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2012, 22:03 #3
а синглетон кто будет удалять!!?
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 22:10  [ТС] #4
Цитата Сообщение от Jupiter Посмотреть сообщение
а синглетон кто будет удалять!!?
C++
1
2
3
4
~Singleton() {
    delete[]p;
    inst = NULL;
}
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2012, 22:11 #5
Red Planet, в коде 2 вызова new, и один delete
+ ваш синглетон можно скопировать и переприсвоить и тогда в лучшем случае ваша программа упадет
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
28.05.2012, 22:13 #6
Цитата Сообщение от Red Planet Посмотреть сообщение
C++
1
2
3
4
5
6
if (inst == 0) {
   if (inst == 0) {
      Singleton* volatile temp = new Singleton();
      inst = temp;
   }
}
Это такой DCL, да?) И всё правильно говорят, память, выделенную под сам синглтон не удаляете.
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 22:32  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
ваш синглетон можно скопировать и переприсвоить и тогда в лучшем случае ваша программа упадет
Да, упустил. Надо перекрыть оператор присваивания и конструктор копирования.

В private:

C++
1
2
Singleton& operator = (const Singleton &right);
Singleton(const Singleton &right);
Цитата Сообщение от gray_fox Посмотреть сообщение
Это такой DCL, да?)
Источник. У меня что-то неправильно? Там это неокончательное решение, но к окончательному они так и не пришли.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
28.05.2012, 22:37 #8
Цитата Сообщение от Red Planet Посмотреть сообщение
У меня что-то неправильно?
Не знаю, по этому и спрашиваю) Я с многопоточностью в плюсах никогда не сталкивался, но мне кажется, что нужен lock какой-нибудь после первого if, нет? Иначе непонятен смысл этих двух подряд идущих проверок.
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 22:37  [ТС] #9
Цитата Сообщение от Jupiter Посмотреть сообщение
в коде 2 вызова new, и один delete
Не понял. Один раз new для instance, второй раз - для массива.
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2012, 22:42 #10
Цитата Сообщение от Red Planet Посмотреть сообщение
Один раз new для instance, второй раз - для массива.
это так, а в деструкторе вы удаляете только массив, а синглетон - нет
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 22:50  [ТС] #11
Цитата Сообщение от Jupiter Посмотреть сообщение
это так, а в деструкторе вы удаляете только массив, а синглетон - нет
Значит надо делать:

C++
1
2
3
4
~Singleton() {
    delete[]p;
    inst = NULL;
}
Цитата Сообщение от gray_fox Посмотреть сообщение
память, выделенную под сам синглтон не удаляете
Прочитал "не удаляете" как "не удаляйте".
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2012, 22:52 #12
Цитата Сообщение от Red Planet Посмотреть сообщение
Значит надо делать:
надо делать
C++
1
2
3
4
~Singleton() {
    delete [] p;
    delete inst;
}

Не по теме:

смарт-указатели НАДО юзать

1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
28.05.2012, 22:54 #13
Цитата Сообщение от Red Planet Посмотреть сообщение
inst = NULL;
Память то так всё равно не очистишь.
1
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 23:04  [ТС] #14
Цитата Сообщение от Jupiter Посмотреть сообщение
смарт-указатели
Знаю на уровне "слышал, но никогда не пользовался". Изучу.

Цитата Сообщение от gray_fox Посмотреть сообщение
Не знаю, по этому и спрашиваю) Я с многопоточностью в плюсах никогда не сталкивался, но мне кажется, что нужен lock какой-нибудь после первого if, нет? Иначе непонятен смысл этих двух подряд идущих проверок.
Здесь наугад говорить не стану. Мьютексы требует изучения. А то, что там два if подряд, так это у них ошибка, а я невнимательно скопировал.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 23:04
Привет! Вот еще темы с ответами:

Паттерн "Fasade" - это что? - C++
Паттерн &quot;Fasade&quot; это что и с чем его хавать? своими словами)

Паттерн "Шаблонный метод" - C++
Объясните пожалуйста, что делает этот код по шагам #include &lt;iostream&gt; using namespace std; class Base { void a() {...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
28.05.2012, 23:04
Ответ Создать тему
Опции темы

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