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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
#1

Функция и оператор new - C++

09.04.2012, 13:27. Просмотров 1273. Ответов 15
Метки нет (Все метки)

Как сделать так чтоб все созданное через new в функциях(функциях классов,шаблонов) оставалось в памяти?
Например я создал так шаблон
C++
1
2
3
4
5
6
7
8
9
10
template <class human> class database
{
public:
    int init_base;
    human* baza;
    int size;
    database(int dsize):size(dsize){
    baza = new human[dsize];
    }
void AddElem(human);}
и есть функция в шаблоне

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class human> void database<human>::AddElem(human hum) 
{
    int i;
    size++;
    size_of_base++;
    human* new_base = new human[size];
    for(i=0;i<(size-1);i++)
    new_base[i]=baza[i];
    new_base[size-1]=hum;
    delete baza;
    human* baza = new human[size];
    for(int i=0;i<size;i++)
    baza[i]=new_base[i];
};
т.е. пересоздаю массив в шаблоне увеличивая его размер на 1,но т.к. это функция то все удаляется при выходе из нее(там еще код всякий,на плюсы/минусы особо не смотрите-не в этом ща дело =))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 13:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция и оператор new (C++):

Функция оператор+ в классах - C++
#include &lt;iostream&gt; using namespace std; class Operator { private: int x; public: void SetX(int g); int GetX(); ...

Классы, дружественная функция, оператор ввода - C++
замучался уже не понимаю как написать прогу. Описать дружественную функцию для подсчета общей стоимости всех товаров. В программе...

Дружественная функция-оператор, доступ к закрытым полям класса - C++
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend ostream &amp; operator &lt;&lt; (ostream &amp;,...

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки - C++
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли определённые трудности. Будьте добры, помогите решить. Буду...

Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 - C++
В С++ я ноль, помогите пожалуйста написать прогу Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 ...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.04.2012, 13:34 #2
Цитата Сообщение от iojeg Посмотреть сообщение
т.е. пересоздаю массив в шаблоне увеличивая его размер на 1,но т.к. это функция то все удаляется при выходе из нее(там еще код всякий,на плюсы/минусы особо не смотрите-не в этом ща дело =))
Память, выделенная через new, освободится только после вызова delete, либо по завершении приложения. И у вас нет освобождения памяти по new_base.
1
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 14:03  [ТС] #3
После выхода из фукции этой у мя все значения(смотрю в дебаггере) элементов становятся хренпоймичем(ну или пустыми скажем так) а до этого момента копируются и заполняются так как надо.
тобиш следующая функция которая выводит все на экран (из базы новосозданной) выводит абракадабру-а до этого все ок.

Добавлено через 2 минуты
Если перефразировать-то сам массив виден после функции(ибо дилита небыло) а вот данные в нем пропали

Добавлено через 53 секунды
Прост для меня это равносильно удалению =)

Добавлено через 8 минут
По new_base есть освобождение,прост строки выборочно копировал сюда,непопала.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.04.2012, 14:10 #4
Цитата Сообщение от iojeg Посмотреть сообщение
human* baza = new human[size];
Тут косяк. Объявляется локальная переменная baza, в которую все и пишется. А она уже удаляется.
1
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 14:50  [ТС] #5
Я прально понял что я удаляю основную(которая создается при объявлении нового шаблона) а создаю локальную в функции и в этом косяк?
Собсно в чем и вопрос-что сделать чтоб не удалялась,или стала не локальной,а такойже как начальная baza(как при создании нового объекта-шаблона).
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.04.2012, 14:52 #6
iojeg, Достаточно просто убрать объявление переменной basa из функции. Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class human> void database<human>::AddElem(human hum) 
{
    int i;
    size++;
    size_of_base++;
    human* new_base = new human[size];
    for(i=0;i<(size-1);i++)
    new_base[i]=baza[i];
    new_base[size-1]=hum;
    delete baza;
    baza = new_base;
};
1
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 15:36  [ТС] #7
Получается при удалении delete стирается только то что внутри было? а сам элемент не трется? но всеравно при выходе из функции аблом-на картинках показано.
0
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 15:38  [ТС] #8
Функция и оператор new
Функция и оператор new
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.04.2012, 15:42 #9
iojeg, А где вы в моем коде видите delete new_base?
1
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:05  [ТС] #10
А...оно походу печатает в итоге ту base который был удален,а значения новой base никуда не деваются...блин...над какт чтоб этот бэйс становился "родным" для шаблона...(

Добавлено через 4 минуты
А ваш вариант всетаки неработает вообще в целом) присваивает new_base непойми куда,получается каша.Что с дилитом что без дилита разницы воопще никакой(как это вообще могло повлиять на результат?)

Добавлено через 2 минуты
О_о тока что 1 раз правильно мой вариант сработал изначальный,ща опять фигпойми что выдает-это как такое может быть???
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.04.2012, 16:13 #11
iojeg, Почему это не пойми куда?

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
template <class human> class database
{
public:
    int init_base;
    // В классе хранится указатель на human.
    human* baza;
    int size;
    database(int dsize):size(dsize){
    // В конструкторе происходит инициализация.
    baza = new human[dsize];
    }
void AddElem(human);}
 
template <class human> void database<human>::AddElem(human hum) 
{
    int i;
    size++;
    size_of_base++;
    // Создали новый экземпляр базы.
    human* new_base = new human[size];
    // Скопировали старые значения
    for(i=0;i<(size-1);i++)
    new_base[i]=baza[i];
    // Добавили новые.
    new_base[size-1]=hum;
    // Удалили старую базу.
    delete baza;
    // Присвоили старой базе адрес новой.
    baza = new_base;
    // Итог : base теперь указывает на new_base в которой лежит вся инфа.
};
Добавлено через 7 минут
Пример.

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
#include <iostream>
 
class Cl
{
public:
   Cl():sz(0)
   {
      array = new int[1];
   }
   ~Cl()
   {
      delete[] array;
   }
   void add_int(const int val)
   {
      if (sz + 1 == 1)
      {
         array[sz] = val;
      }
      else
      {
         int* temp_array = new int[sz + 1];
         for (int i = 0; i < sz; ++i)
         {
            temp_array[i] = array[i];
         }
         temp_array[sz] = val;
         delete array;
         array = temp_array;
      }
      ++sz;
   }
   void print()
   {
      std::cout << "size: " << sz << std::endl;
      for (int i = 0; i < sz; ++i)
      {
         std::cout << array[i] << " ";
      }
      std::cout << std::endl;
   }
private:
   int* array;
   int sz;
};
 
int main()
{
   Cl c;
   c.add_int(1);
   c.add_int(2);
   c.add_int(3);
   c.print();
}
http://liveworkspace.org/code/3bec69...2a06ed1f3a3af0
1
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:23  [ТС] #12
работает через раз...помучаюсь поищу почему непашет...ощущение что из-за памяти что-то
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.04.2012, 16:24 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
delete baza;
база же вроде указатель на массив,значит надо удалять delete []
2
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.04.2012, 16:29 #14
alexey31415, Да. Спасибо. Опечатко.
1
iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:38  [ТС] #15
Вроде работает так но в релизе эксепшином завершается из-за памяти...спс что помогли,забыл что имя массива это и есть указатель на массив и можно так сделать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 16:38
Привет! Вот еще темы с ответами:

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости - C++
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области видимости.

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. - C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...

Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->? - C++
#include &lt;iostream&gt; using namespace std; class random { public: void Set(int b){a=b;} int Get(){return a;} private: ...

Оператор break как оператор go to next - C++
Подскажите, в этом примере break эквивалентна действию оператора go to next?


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

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

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