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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 13:27     Функция и оператор new #1
Как сделать так чтоб все созданное через 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,но т.к. это функция то все удаляется при выходе из нее(там еще код всякий,на плюсы/минусы особо не смотрите-не в этом ща дело =))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 13:27     Функция и оператор new
Посмотрите здесь:

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. C++
C++ Оператор break как оператор go to next
Дружественная функция-оператор, доступ к закрытым полям класса C++
C++ Функция оператор+ в классах
C++ Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.04.2012, 13:34     Функция и оператор new #2
Цитата Сообщение от iojeg Посмотреть сообщение
т.е. пересоздаю массив в шаблоне увеличивая его размер на 1,но т.к. это функция то все удаляется при выходе из нее(там еще код всякий,на плюсы/минусы особо не смотрите-не в этом ща дело =))
Память, выделенная через new, освободится только после вызова delete, либо по завершении приложения. И у вас нет освобождения памяти по new_base.
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 14:03  [ТС]     Функция и оператор new #3
После выхода из фукции этой у мя все значения(смотрю в дебаггере) элементов становятся хренпоймичем(ну или пустыми скажем так) а до этого момента копируются и заполняются так как надо.
тобиш следующая функция которая выводит все на экран (из базы новосозданной) выводит абракадабру-а до этого все ок.

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

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

Добавлено через 8 минут
По new_base есть освобождение,прост строки выборочно копировал сюда,непопала.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.04.2012, 14:10     Функция и оператор new #4
Цитата Сообщение от iojeg Посмотреть сообщение
human* baza = new human[size];
Тут косяк. Объявляется локальная переменная baza, в которую все и пишется. А она уже удаляется.
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 14:50  [ТС]     Функция и оператор new #5
Я прально понял что я удаляю основную(которая создается при объявлении нового шаблона) а создаю локальную в функции и в этом косяк?
Собсно в чем и вопрос-что сделать чтоб не удалялась,или стала не локальной,а такойже как начальная baza(как при создании нового объекта-шаблона).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.04.2012, 14:52     Функция и оператор new #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;
};
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 15:36  [ТС]     Функция и оператор new #7
Получается при удалении delete стирается только то что внутри было? а сам элемент не трется? но всеравно при выходе из функции аблом-на картинках показано.
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 15:38  [ТС]     Функция и оператор new #8
Функция и оператор new
Функция и оператор new
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.04.2012, 15:42     Функция и оператор new #9
iojeg, А где вы в моем коде видите delete new_base?
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:05  [ТС]     Функция и оператор new #10
А...оно походу печатает в итоге ту base который был удален,а значения новой base никуда не деваются...блин...над какт чтоб этот бэйс становился "родным" для шаблона...(

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

Добавлено через 2 минуты
О_о тока что 1 раз правильно мой вариант сработал изначальный,ща опять фигпойми что выдает-это как такое может быть???
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.04.2012, 16:13     Функция и оператор new #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
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:23  [ТС]     Функция и оператор new #12
работает через раз...помучаюсь поищу почему непашет...ощущение что из-за памяти что-то
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.04.2012, 16:24     Функция и оператор new #13
Цитата Сообщение от ForEveR Посмотреть сообщение
delete baza;
база же вроде указатель на массив,значит надо удалять delete []
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.04.2012, 16:29     Функция и оператор new #14
alexey31415, Да. Спасибо. Опечатко.
iojeg
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:38  [ТС]     Функция и оператор new #15
Вроде работает так но в релизе эксепшином завершается из-за памяти...спс что помогли,забыл что имя массива это и есть указатель на массив и можно так сделать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 18:26     Функция и оператор new
Еще ссылки по теме:

C++ В Delphi есть оператор cost i of. и т.д. Есть ли в C++ такой же оператор?
C++ Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.04.2012, 18:26     Функция и оператор new #16
Значит где то был выход за пределы массива. Точное описание ошибки можно?
Yandex
Объявления
09.04.2012, 18:26     Функция и оператор new
Ответ Создать тему
Опции темы

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