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

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

Восстановить пароль Регистрация
 
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 22:01     Паттерн "Одиночка" и динамическая память #1
Приветствую всех! Набросал паттерн "Одиночка", при конструировании есть динамическая память, также статическое поле (имеется в виду 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;
}
// ---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 22:01     Паттерн "Одиночка" и динамическая память
Посмотрите здесь:

C++ Паттерн "Одиночка" и конструктор копии с оператором присваивания
C++ по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно
Динамическая структура данных(контейнер) типа "Вектор" C++
Курсовая работа "Паттерн Компоновщик. Расчет стоимости оборудования исходя из его составных частей." C++
Паттерн "Fasade" - это что? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
28.05.2012, 22:03     Паттерн "Одиночка" и динамическая память #2
ну можно для разнообразия деструктор сделать виртуальным
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2012, 22:03     Паттерн "Одиночка" и динамическая память #3
а синглетон кто будет удалять!!?
Red Planet
 Аватар для 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;
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2012, 22:11     Паттерн "Одиночка" и динамическая память #5
Red Planet, в коде 2 вызова new, и один delete
+ ваш синглетон можно скопировать и переприсвоить и тогда в лучшем случае ваша программа упадет
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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, да?) И всё правильно говорят, память, выделенную под сам синглтон не удаляете.
Red Planet
 Аватар для 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, да?)
Источник. У меня что-то неправильно? Там это неокончательное решение, но к окончательному они так и не пришли.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
28.05.2012, 22:37     Паттерн "Одиночка" и динамическая память #8
Цитата Сообщение от Red Planet Посмотреть сообщение
У меня что-то неправильно?
Не знаю, по этому и спрашиваю) Я с многопоточностью в плюсах никогда не сталкивался, но мне кажется, что нужен lock какой-нибудь после первого if, нет? Иначе непонятен смысл этих двух подряд идущих проверок.
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 22:37  [ТС]     Паттерн "Одиночка" и динамическая память #9
Цитата Сообщение от Jupiter Посмотреть сообщение
в коде 2 вызова new, и один delete
Не понял. Один раз new для instance, второй раз - для массива.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2012, 22:42     Паттерн "Одиночка" и динамическая память #10
Цитата Сообщение от Red Planet Посмотреть сообщение
Один раз new для instance, второй раз - для массива.
это так, а в деструкторе вы удаляете только массив, а синглетон - нет
Red Planet
 Аватар для 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 Посмотреть сообщение
память, выделенную под сам синглтон не удаляете
Прочитал "не удаляете" как "не удаляйте".
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 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;
}

Не по теме:

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

gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
28.05.2012, 22:54     Паттерн "Одиночка" и динамическая память #13
Цитата Сообщение от Red Planet Посмотреть сообщение
inst = NULL;
Память то так всё равно не очистишь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 23:04     Паттерн "Одиночка" и динамическая память
Еще ссылки по теме:

C++ Паттерн "Шаблонный метод"
Динамическая структура "Стек". Обновить значение элемента C++
Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" C++

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

Или воспользуйтесь поиском по форуму:
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 23:04  [ТС]     Паттерн "Одиночка" и динамическая память #14
Цитата Сообщение от Jupiter Посмотреть сообщение
смарт-указатели
Знаю на уровне "слышал, но никогда не пользовался". Изучу.

Цитата Сообщение от gray_fox Посмотреть сообщение
Не знаю, по этому и спрашиваю) Я с многопоточностью в плюсах никогда не сталкивался, но мне кажется, что нужен lock какой-нибудь после первого if, нет? Иначе непонятен смысл этих двух подряд идущих проверок.
Здесь наугад говорить не стану. Мьютексы требует изучения. А то, что там два if подряд, так это у них ошибка, а я невнимательно скопировал.
Yandex
Объявления
28.05.2012, 23:04     Паттерн "Одиночка" и динамическая память
Ответ Создать тему
Опции темы

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