Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12

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

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

Author24 — интернет-сервис помощи студентам
Как сделать так чтоб все созданное через 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2012, 13:27
Ответы с готовыми решениями:

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

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

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

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

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

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

Добавлено через 8 минут
По new_base есть освобождение,прост строки выборочно копировал сюда,непопала.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.04.2012, 14:10
Цитата Сообщение от iojeg Посмотреть сообщение
human* baza = new human[size];
Тут косяк. Объявляется локальная переменная baza, в которую все и пишется. А она уже удаляется.
1
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 14:50  [ТС]
Я прально понял что я удаляю основную(которая создается при объявлении нового шаблона) а создаю локальную в функции и в этом косяк?
Собсно в чем и вопрос-что сделать чтоб не удалялась,или стала не локальной,а такойже как начальная baza(как при создании нового объекта-шаблона).
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.04.2012, 14:52
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  [ТС]
Получается при удалении delete стирается только то что внутри было? а сам элемент не трется? но всеравно при выходе из функции аблом-на картинках показано.
0
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 15:38  [ТС]

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.04.2012, 15:42
iojeg, А где вы в моем коде видите delete new_base?
1
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:05  [ТС]
А...оно походу печатает в итоге ту base который был удален,а значения новой base никуда не деваются...блин...над какт чтоб этот бэйс становился "родным" для шаблона...(

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

Добавлено через 2 минуты
О_о тока что 1 раз правильно мой вариант сработал изначальный,ща опять фигпойми что выдает-это как такое может быть???
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.04.2012, 16:13
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/... ed1f3a3af0
1
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:23  [ТС]
работает через раз...помучаюсь поищу почему непашет...ощущение что из-за памяти что-то
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
09.04.2012, 16:24
Цитата Сообщение от ForEveR Посмотреть сообщение
delete baza;
база же вроде указатель на массив,значит надо удалять delete []
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.04.2012, 16:29
alexey31415, Да. Спасибо. Опечатко.
1
 Аватар для iojeg
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 12
09.04.2012, 16:38  [ТС]
Вроде работает так но в релизе эксепшином завершается из-за памяти...спс что помогли,забыл что имя массива это и есть указатель на массив и можно так сделать
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
09.04.2012, 18:26
Значит где то был выход за пределы массива. Точное описание ошибки можно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2012, 18:26
Помогаю со студенческими работами здесь

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

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

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

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

Оператор-функция. Подпрограмма - функция. Форматный вывод
Здравствуйте, товарищи! В общем ситуация такая: в школе информатики,считай, и не было. Сейчас пишу все программы по чутью, либо катаю.Но...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

Новые блоги и статьи
Создаем RESTful API с Laravel
Jason-Webb 28.04.2025
REST (Representational State Transfer) — это архитектурный стиль, который определяет набор принципов для создания веб-сервисов. Этот подход к построению API стал стандартом де-факто в современной. . .
Дженерики в C# - продвинутые техники
stackOverflow 28.04.2025
История дженериков началась с простой идеи — создать механизм для разработки типобезопасного кода без потери производительности. До их появления программисты использовали неуклюжие преобразования. . .
Тестирование в Python: PyTest, Mock и лучшие практики TDD
py-thonny 28.04.2025
Тестирование кода играет весомую роль в жизненном цикле разработки программного обеспечения. Для разработчиков Python существует богатый выбор инструментов, позволяющих создавать надёжные и. . .
Работа с PDF в Java с iText
Javaican 28.04.2025
Среди всех форматов PDF (Portable Document Format) заслуженно занимает особое место. Этот формат, созданный компанией Adobe, превратился в универсальный стандарт для обмена документами, не зависящий. . .
Динамические массивы в C++ - создание и использование
NullReferenced 27.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 27.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 27.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru