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

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

Войти
Регистрация
Восстановить пароль
 
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
#1

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

30.05.2012, 20:30. Просмотров 676. Ответов 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 минут
Неужели такой сложный вопрос?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 20:30     Динамическая память под объект
Посмотрите здесь:

C++ Динамическая память
Динамическая память C++
Динамическая память C++
C++ динамическая память под матрицы
C++ Динамическая память
C++ Задачка: Динамическая память
C++ Динамическая память [new]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
30.05.2012, 20:37     Динамическая память под объект #2
C++
1
busses=new bus[2];
Здесь выделяется память под новый массив, значения старого теряются.
Andrey.K
341 / 262 / 15
Регистрация: 14.11.2010
Сообщений: 482
30.05.2012, 20:38     Динамическая память под объект #3
При первом выделении у тебя x=0, потом значения перезаписываются так как переопределния массива объектов идет.
При втором выделении у тебя busses[0].x=0, а busses[1].x=3 . Всё правильно работает? В чём проблема, ты же не заменяешь busses[0].x на другое значение вот оно и равняется 0.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
30.05.2012, 20:42     Динамическая память под объект #4
А чего Вы удивляетесь? Вы думаете когда пишите второй раз
C++
1
busses = new bus[ 2 ];
Вы добавляете 2 объекта? Оператор new, при успешном выделении памяти, возвращает указатель на эту самую выделенную память. При этом старая память у Вас остается потерянной. Такие ситуации приводят к утечке памяти.
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
30.05.2012, 21:17  [ТС]     Динамическая память под объект #5
Я вроде написал в 1 посте что знаю в чем проблема, а вас прошу показать как добавлять память без потери уже записаных данных.
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
30.05.2012, 21:23     Динамическая память под объект #6
Просто выделите сразу размер для всех элементов, т.е. сразу new bus[2].
instagib
122 / 85 / 3
Регистрация: 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/
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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.
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
30.05.2012, 23:29  [ТС]     Динамическая память под объект #9
Спасибо
MrGluck
Ворчун
Эксперт CЭксперт С++
6677 / 3858 / 511
Регистрация: 29.11.2010
Сообщений: 10,217
30.05.2012, 23:31     Динамическая память под объект #10
Цитата Сообщение от AfoTax Посмотреть сообщение
C++
1
friend void main();
оО Отсыпь немного.
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.
Я привел просто пример проги. В осном проекте объекты гораздо больше и много элементов, а на такую операцию понадобится слишком много рессурсов.
Avazart
7066 / 5243 / 263
Регистрация: 10.12.2010
Сообщений: 23,072
Записей в блоге: 17
30.05.2012, 23:56     Динамическая память под объект #12
Ну в таком случае придется реализовать вектор ручками самому
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.05.2012, 00:00     Динамическая память под объект #13
А как Вы хотели? Просто раз и добавили новые элементы? Как вы себе это представляете в реализованном виде? По другому никак и не получится.
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
31.05.2012, 01:30  [ТС]     Динамическая память под объект #14
Я точно знаю в простой C это без проблем реализовывается, поэтому думаю и в C++ что-то подобное предусмотрено.
Avazart
7066 / 5243 / 263
Регистрация: 10.12.2010
Сообщений: 23,072
Записей в блоге: 17
31.05.2012, 01:37     Динамическая память под объект #15
Ну да- вектор
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.05.2012, 10:40     Динамическая память под объект #16
В Си вообще нет операторов выделения памяти, там есть только функции для этого. И я сомневаюсь, что функция realloc работает по другому принципу.
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
31.05.2012, 12:06  [ТС]     Динамическая память под объект #17
Ясно, я всё понял, всем спасибо.
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 340
31.05.2012, 15:48     Динамическая память под объект #18
AfoTax, выделяешь malloc память, а если изменить, выделяешь память для другого указателя, копируешь значения, удаляешь старый массив. оформи красиво в виде функций и будет все ок.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2012, 13:02     Динамическая память под объект
Еще ссылки по теме:

Динамическая память C++
C++ Динамическая память - блоками
Указатели и динамическая память C++
Можно ли в С++ выделить память под объект в заданную мной область памяти? C++
C++ Динамическая память C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.06.2012, 13:02     Динамическая память под объект #19
Цитата Сообщение от Toshkarik Посмотреть сообщение
я сомневаюсь, что функция realloc работает по другому принципу
Насколько мне известно, realloc по мере возможности действительно расширяет выделенную память, без копирования.

Добавлено через 1 минуту
instagib, malloc не вызывает конструкторы.
Yandex
Объявления
02.06.2012, 13:02     Динамическая память под объект
Ответ Создать тему
Опции темы

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