Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
1

Динамическая память под объект

30.05.2012, 20:30. Просмотров 719. Ответов 18
Метки нет (Все метки)

Проблема в том, что после второго выделения в первом элементе уже хранится 0. В коде описана проблема. Я понимаю из-за чего проблема, но не знаю как её обойти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using namespace std;
 
class bus
{
    int x;
public:
    bus(){x=0;}
    friend void main();
};
 
void main()
{
    bus *busses;
    busses=new bus[1];
    busses[0].x=1;
    cout<<busses[0].x<<endl; // здесь busses[0] равен 1
    busses=new bus[2];
    busses[1].x=3;
    cout<<busses[0].x<<busses[1].x<<endl; // а здесь он уже равен 0.
 
    system("pause");
}
Добавлено через 2 часа 27 минут
Неужели такой сложный вопрос?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 20:30
Ответы с готовыми решениями:

динамическая память под матрицы
Добрый день! Нужна помощь очень сильно. Есть две задачи, помогите пож...

Можно ли в С++ выделить память под объект в заданную мной область памяти?
Есть код static inline void convertFromTextAlternative(quint8* dst, const...

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять...

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть...

Динамическая память
Дано натуральное число n и целые числа{a}_{1},{a}_{2},...,{a}_{n}. Выяснить,...

18
rakota
35 / 35 / 12
Регистрация: 05.02.2012
Сообщений: 76
30.05.2012, 20:37 2
C++
1
busses=new bus[2];
Здесь выделяется память под новый массив, значения старого теряются.
0
Andrey.K
344 / 265 / 128
Регистрация: 14.11.2010
Сообщений: 482
30.05.2012, 20:38 3
При первом выделении у тебя x=0, потом значения перезаписываются так как переопределния массива объектов идет.
При втором выделении у тебя busses[0].x=0, а busses[1].x=3 . Всё правильно работает? В чём проблема, ты же не заменяешь busses[0].x на другое значение вот оно и равняется 0.
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
30.05.2012, 20:42 4
А чего Вы удивляетесь? Вы думаете когда пишите второй раз
C++
1
busses = new bus[ 2 ];
Вы добавляете 2 объекта? Оператор new, при успешном выделении памяти, возвращает указатель на эту самую выделенную память. При этом старая память у Вас остается потерянной. Такие ситуации приводят к утечке памяти.
0
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
30.05.2012, 21:17  [ТС] 5
Я вроде написал в 1 посте что знаю в чем проблема, а вас прошу показать как добавлять память без потери уже записаных данных.
0
rakota
35 / 35 / 12
Регистрация: 05.02.2012
Сообщений: 76
30.05.2012, 21:23 6
Просто выделите сразу размер для всех элементов, т.е. сразу new bus[2].
0
instagib
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
30.05.2012, 21:29 7
AfoTax, попробуй использовать vector.
C++
1
2
#include <vector>
std::vector<bus> busses;
и добавляй, удаляй, без потерь.

Добавлено через 1 минуту
http://cplusplus.com/reference/stl/vector/push_back/
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
30.05.2012, 21:51 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    bus *busses;
    busses=new bus[1];
    busses[0].x=1;
    cout<<busses[0].x<<endl; // здесь busses[0] равен 1
 
    {
        bus *temp = busses;
        busses = new bus [ 2 ];
        busses[ 0 ] = temp[ 0 ];
        delete [] temp;
    }
 
    busses[1].x=3;
    cout<<busses[0].x<<busses[1].x<<endl; // а здесь он уже равен 0.
0
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
30.05.2012, 23:29  [ТС] 9
Спасибо
0
MrGluck
Модератор
Эксперт CЭксперт С++
8086 / 4939 / 1431
Регистрация: 29.11.2010
Сообщений: 13,395
30.05.2012, 23:31 10
Цитата Сообщение от AfoTax Посмотреть сообщение
C++
1
friend void main();
оО Отсыпь немного.
1
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
30.05.2012, 23:35  [ТС] 11
Цитата Сообщение от instagib Посмотреть сообщение
AfoTax, попробуй использовать vector.
C++
1
2
#include <vector>
std::vector<bus> busses;
и добавляй, удаляй, без потерь.

Добавлено через 1 минуту
http://cplusplus.com/reference/stl/vector/push_back/
Вектора использовать нельзя, типо не проходили такого)

Цитата Сообщение от rakota Посмотреть сообщение
Просто выделите сразу размер для всех элементов, т.е. сразу new bus[2].
Изначально не известно сколько будет элементов, может быть хоть 100500

Цитата Сообщение от Toshkarik Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    bus *busses;
    busses=new bus[1];
    busses[0].x=1;
    cout<<busses[0].x<<endl; // здесь busses[0] равен 1
 
    {
        bus *temp = busses;
        busses = new bus [ 2 ];
        busses[ 0 ] = temp[ 0 ];
        delete [] temp;
    }
 
    busses[1].x=3;
    cout<<busses[0].x<<busses[1].x<<endl; // а здесь он уже равен 0.
Я привел просто пример проги. В осном проекте объекты гораздо больше и много элементов, а на такую операцию понадобится слишком много рессурсов.
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
30.05.2012, 23:56 12
Ну в таком случае придется реализовать вектор ручками самому
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
31.05.2012, 00:00 13
А как Вы хотели? Просто раз и добавили новые элементы? Как вы себе это представляете в реализованном виде? По другому никак и не получится.
0
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
31.05.2012, 01:30  [ТС] 14
Я точно знаю в простой C это без проблем реализовывается, поэтому думаю и в C++ что-то подобное предусмотрено.
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
31.05.2012, 01:37 15
Ну да- вектор
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
31.05.2012, 10:40 16
В Си вообще нет операторов выделения памяти, там есть только функции для этого. И я сомневаюсь, что функция realloc работает по другому принципу.
0
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
31.05.2012, 12:06  [ТС] 17
Ясно, я всё понял, всем спасибо.
0
instagib
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
31.05.2012, 15:48 18
AfoTax, выделяешь malloc память, а если изменить, выделяешь память для другого указателя, копируешь значения, удаляешь старый массив. оформи красиво в виде функций и будет все ок.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
02.06.2012, 13:02 19
Цитата Сообщение от Toshkarik Посмотреть сообщение
я сомневаюсь, что функция realloc работает по другому принципу
Насколько мне известно, realloc по мере возможности действительно расширяет выделенную память, без копирования.

Добавлено через 1 минуту
instagib, malloc не вызывает конструкторы.
0
02.06.2012, 13:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2012, 13:02

Динамическая память
Каким способом можно задать динамическую память , кроме как через new ?

Динамическая память
Кто сможет помочь? Дана матрица А. Упорядочить элементы каждой строки в...

Динамическая память.
Всем привет! Уважаемые знатоки, можете посмотреть мою реализацию класса...


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

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

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