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

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

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

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

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

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

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

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