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

Копирование контейнера vector в конструкторе (STL) - C++

Восстановить пароль Регистрация
 
Magister
 Аватар для Magister
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 6
20.02.2013, 14:41     Копирование контейнера vector в конструкторе (STL) #1
Добрый день! У меня есть класс, в котором объявлен вектор указателей на объекты:
C++
1
2
3
4
5
6
7
8
9
10
class Schedule
{
public:
...
    Schedule(void);
    ~Schedule(void);
private:
    string day;
    vector<Lesson*> studies;
}
В своё время вызывается вектор этих объектов в функции main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include "Schedule.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    const int N = 5; //N - number of written days.
    vector<Schedule*> myPlan;
    Schedule **weekday = new Schedule*[N];
    for(int i=0; i < N; i++)
    {
        weekday[i] = new Schedule(); //cannot copy vector to weekday here :(
        myPlan.push_back(weekday[i]);
    }
...
}
Конструктор Schedule() выглядит так:
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
Schedule::Schedule(void)
{
    ifstream inClientFile("I22.dat", ios::in);
    if ( !inClientFile )
    {
        cerr << "File couldn't be opened!" << endl;
        exit(1);
    }
 
    int count; //How many lessons do we have?
    static int filePosition = 0;
 
    Lesson *newLesson = new Lesson();
    int  numero;
    string nume;
    Auditory camera;
    Time timp;
 
    cout<<"Reading day.."<<endl;
    inClientFile.seekg(filePosition); //pereustanovka ukazatelya pozitii file'a
                                    //na sootvetstvuiushii deni
    inClientFile >> day >> count;
    for (int i = 0; i < count; i++)
    {   
        inClientFile >> numero >> nume >> camera.room >> camera.block >> timp.hour >> timp.minute;
            newLesson->setNumber(numero);
            newLesson->setName(nume);
            newLesson->setAud(camera);
            newLesson->setTime(timp);
        
        this->studies.push_back(newLesson);
    }
    filePosition = inClientFile.tellg();
 
    delete newLesson;
}
Внутри конструктора данные из файла считываются отлично, затем объекту weekday[i] передаётся поле day, тогда как вектор studies остаётся в конструкторе. В чём дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2013, 14:41     Копирование контейнера vector в конструкторе (STL)
Посмотрите здесь:

C++ Структура, с использованием контейнера библиотеки STL
reallocation памяти контейнера std::vector C++
Из STL контейнера C++
Реализация примитивного STL совместимого контейнера C++
Очистка контейнера vector C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 15:51     Копирование контейнера vector в конструкторе (STL) #2
Очень долго смотрел в приведенный код, перечитывал вопрос. Так и не понял, в чем проблема и в каком месте проявляется. Попробуй развернуто как-нибудь пояснить?

А, понял, кажется
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.02.2013, 16:16     Копирование контейнера vector в конструкторе (STL) #3
Цитата Сообщение от Magister Посмотреть сообщение
this->studies.push_back(newLesson);
а ты уверен что в конструкторе это нормально?

Добавлено через 3 минуты
зашел в конструктор, создал
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
Lesson *newLesson = new Lesson();
записал (как ты думаешь, а если что ты записал туда адрес!!!)
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
this->studies.push_back(newLesson);
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
delete newLesson;
по данному адресу удалил объект, и ты думаешь потом в вектое что то останется?, я думаю это максимум адрес в никуда, совет - почитай майерса про использование stl
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 16:16     Копирование контейнера vector в конструкторе (STL) #4
Если я понял правильно, то вот в чем проблема:

по завершении этой строки:
Цитата Сообщение от Magister Посмотреть сообщение
weekday[i] = new Schedule(); //cannot copy vector to weekday here
weekday[i] содержит нормальный day, но всякую ерунду в studies.

А вот он источник бед: ты создаешь объект Lesson в конструкторе и инициализируешь его. И вроде бы все нормально. Потом указатель на подготовленный объект ты пихаешь в studies:
C++
1
this->studies.push_back(newLesson);
И тут тоже вроде все нормально, он там появляется. НО studies содержит копию указателя на созданный объект Lesson. Т.е. теперь у тебя есть динамический объект и 2 указателя на него, по одному из которых ты удаляешь память по завершении конструктора:
C++
1
delete newLesson;
Получается, что не существует более твоего Lesson, который ты сформировал в конструкторе, а вектор studies теперь содержит указатель на мусор. Источник зол - семантика копирования, реализуемая контейнерами STL.

Во) пока катал - сверху дельный ответ появился aLarman читает мысли)
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.02.2013, 16:20     Копирование контейнера vector в конструкторе (STL) #5
если не сделать последнего удаления, то скорее всего объект все равно удалиться, вышли из области выидимости - компилятор умный - затрет)

Добавлено через 56 секунд
ITcrusader я читаю твои мысли хД

Добавлено через 1 минуту
Цитата Сообщение от ITcrusader Посмотреть сообщение
Источник зол - семантика копирования, реализуемая контейнерами STL.
это кончно да) но почитав правильные книжки учишься их обходить)))
Yandex
Объявления
20.02.2013, 16:20     Копирование контейнера vector в конструкторе (STL)
Ответ Создать тему
Опции темы

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