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

Правильная инициализация ? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Можно ли разобрать экзешник? http://www.cyberforum.ru/cpp-beginners/thread1010691.html
есть проблема, мне нужно где то найти исходный код файлового менеджера mucommander и несколько видоизменить его, поменять название и некоторые иконки. как я могу это сделать?
C++ Создать программу, которая выводит на экран символьную матрицу создать прогу которая выводит на экран символьную матрицу. пример вывода. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * http://www.cyberforum.ru/cpp-beginners/thread1010688.html
получить машинные результатный сравнить их со значениями соответствующей функции C++
помогите написать программу! данные ниже выражения представляют собой формулы приближенного вычисления различных функций по разложению их в ряд Тейлора в окрестностях указных точек. В последующем...
Дана целочисленная прямоугольная матрица. Определить: C++
2. Дана целочисленная прямоугольная матрица. Определить: а)количество столбцов, не содержащих ни одного нулевого элемента; b) характеристикой столбца целочисленной матрицы назовем сумму модулей его...
C++ Вывести координаты http://www.cyberforum.ru/cpp-beginners/thread1010673.html
Как решить эту задачу? Капитан Флинт зарыл клад на Острове сокровищ. Он оставил описание, как найти клад. Описание состоит из строк вида: "North 5", где слово – одно из "North", "South",...
C++ Выведите фамилии и имена учащихся в порядке убывания их среднего балла Помогите, пожалуйста, с решением, последний тест не проходит, пишет "превышено максимальное время работы". Вместо пузырька вставляли другие сортировки, ничего не помогло. Выведите фамилии и... подробнее

Показать сообщение отдельно
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.11.2013, 23:40
Ваш код, в студии, вот здесь исключение выбрасывает:
C++
1
2
3
4
5
6
7
8
ArrayOfInt::ArrayOfInt(int size)
{
    //delete [] p_; // удаление по неинициализированному указателю
    this->size_ = size;
    p_ = new int[size_];
    for (int i = 0; i < size_; i++)
        p_[i] = 0;
}
Если у вас нет исключения, то значит компилятор обнуляет неинициализированные указатели, но это всё равно кривизна кода.
Если у вас в классе есть поля-указатели, то обязательно определяют конструктор копирования и присваивания.
Вот здесь происходит присваивание объектов ArrayOfInt:
C++
1
2
3
4
5
6
7
8
9
SqArrayOfInt::SqArrayOfInt(int size)
{
    this->size_ = size;
    p_ = new ArrayOfInt[size_];
    for (int i = 0 ; i < size ; i++) {
        ArrayOfInt t(size);
        p_[i] = t; // присваивание
    }
}
Так как оператор присваивания не определён явно, то работает тот, который по умолчанию. Он просто копирует указатели. В данном случае, это указатель, который находится в локальном объекте t, и который уничнтожается при каждой новой итерации, при этом память, с которой связан указаетль в t, освобождается деструктором.

Добавлено через 11 минут
А для того, чтобы работало то, что предложил Peregrin, как раз нужен явно заданный конструктор копирования(для передачи объекта по значению). Хотя делать так, как предложил Peregrin необязательно. Объект локальный, но сохраняется в нелокальном объекте (arr), после чего становится уже ненужным.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru