Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Что не так в коде?  (Прочитано 6860 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 18-03-2009 19:33 » 

Есть класс:

Код:
class Row {
public:
    Row(int, int);
    ~Row() { delete [] arr; }
    void print();
    void rewrite(int, int);
    void extend(int, int);
    int _size;
private:
    int * arr;
    int size;
};

с реализацией конструктора:

Код:
Row::Row(int x, int y) {
    _size = size = 0;
    extend(x, y);
}

и реализацией функции extend:

Код:
void Row::extend(int x, int y) {
    //Записуємо вміст масива arr в temparr
    int * temparr = new int(size);
    for(int i = 0; i < size; ++i)
        temparr[i] = arr[i];
    //Збільшуємо розмір масиива arr
    if (size != 0)
        delete [] arr;
    _size = size += 2;
    arr = new int(size);
    //Ініціалізуємо новий масив
    for(int i = 0; i < size - 2; ++i)
        arr[i] = temparr[i];
    delete [] temparr;//видаляємо тимчасовий масив з динамічної пам’яті
    arr[size - 2] = x;
    arr[size - 1] = y;
}

В функции main пишу следующее:

Код:
    Row r(0, 0);
    vector <Row> a;
    a.push_back(r);

вызывает ошибку:
Цитата
Инструкция по адресу "0х7с910с27" обратилась к памяти по адресу "0х003сff9d", память не может быть "read".

Подскажите пожалуйста, что не так.
« Последнее редактирование: 18-03-2009 19:38 от Inkognito » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #1 : 18-03-2009 19:35 » 

Работаю в Dev-C++ v4.9.9.2.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 18-03-2009 19:53 » 

Ну, самое главное "что не так" - это отсутствие реализации копирующего конструктора и оператора копирования, при том, что в классе есть динамический массив. При помещении объекта в вектор происходит копирование, при котором будет скопировано только значение указателя, что обычно ведёт к проблемам.

Второе "что не так" - это совершенно непонятная работа с памятью. Массив ещё не выделен, а функция extend пытается сделать что-то странное:
Код:
int * temparr = new int(size); 
должно быть, подразумевалось
Код:
int * temparr = new int[size]; 
а потом, если размер не нулевой, не проверяя, существует ли arr, читает оттуда.
« Последнее редактирование: 18-03-2009 20:08 от Вад » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 18-03-2009 20:15 » 

должно быть, подразумевалось
Код:
int * temparr = new int[size]; 
Да, действительно, описался...

а потом, если размер не нулевой, не проверяя, существует ли arr, читает оттуда.
Если размер не нулевой, то массив обязательно существует.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 18-03-2009 20:17 » 

Да, действительно, описался...
Неслабо описался. Вместо массива выделял память на 1 int, инициализируя его значением size Улыбаюсь

Да, действительно, если размер не нулевой, то массив должен существовать - но это если в прошлый раз из конструктора была вызвана extend. Ненадёжно как-то.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines