Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с деструктором, проблема с деструктором delete [] 
V
    Опции темы
htzg
Дата 8.9.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Народ! Есть проблема!
Создал класс. Компилятор его проглатывает. Но! Что то не то с деструктором. При запуске программа останавливается и выдается след. сообщение:

"Unhandled exception at 0x77b21fe0 in Prop-test1.exe: 0xC0000005: Access violation reading location 0x0000ffff"

Курсором указывает на
Код

delete [] Values[i][j] ;


Помогите разобраться! smile

Код

#include "stdafx.h"
#include <iostream>
#include <vector>

class CProp
{
    public:
        int NDIVIX,NDIVIY,NDIVIZ;
        float ***Values ;
        void Set(int ndiviX, int ndiviY, int ndiviZ)
        {
            ///----------Prop      -------------------
            Values = new float**[ndiviX];
            for(int i=0 ; i < ndiviX; ++i)
            {
                Values[i] = new float*[ndiviY];
                for(int j=0 ; j < ndiviY ; ++j)
                    Values[i][j] = new float[ndiviZ];
            }
            ///---------------------------------------
            ///
            ///------------Prop  inputing-------------
            for(int k=0 ; k < ndiviZ ; ++k)
                for(int j=0 ; j < ndiviY ; ++j)
                    for(int i=0 ; i < ndiviX ; ++i)
                        Values[i][j][k] = 1.0 ;
            ///---------------------------------------
            NDIVIX=ndiviX;
            NDIVIY=ndiviY;
            NDIVIZ=ndiviZ;
        }
        ~CProp();
};

CProp::~CProp()
{
    ///------------Prop destruction-----------
    for(int i=0 ; i < NDIVIX; ++i)
    {
        for(int j=0 ; j < NDIVIY; ++j)
        {
            delete [] Values[i][j] ;
        }
        delete  Values[i] ;
    }
    delete [] Values ;
    ///---------------------------------------
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<CProp> vProp;
    for(int i=0;i<3;++i)
    {
        CProp Prop;
        Prop.Set(10,20,5);
        vProp.push_back(Prop);
    }
    
    char ch;
    std::cin >> ch;

    return 0;
}



Это сообщение отредактировал(а) htzg - 8.9.2010, 18:39
PM MAIL   Вверх
icecrashldr
Дата 8.9.2010, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Код

 for(int i=0 ; i < NDIVIX; ++i)
    {
        for(int j=0 ; j < NDIVIY; ++j)
        {
            delete Values[i][j] ;
        }
        delete  []  Values[i] ;
    }
    delete [] Values ;

PM MAIL WWW   Вверх
Sartorius
Дата 8.9.2010, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



push_back на сколько я помню конструктор копирования вызывает, которого у тебя нет. Получаем неинициализированне объекты в векторе
PM MAIL ICQ   Вверх
htzg
Дата 8.9.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



не подскажите как правильно конструктор копирования в моем случае создать...?
Я создаю, та же ошибка
Код

CProp::CProp(const CProp& CPr)
{
    NDIVIX = CPr.NDIVIX;
    NDIVIY = CPr.NDIVIY;
    NDIVIZ = CPr.NDIVIZ;
    Values = CPr.Values;
}

PM MAIL   Вверх
Sartorius
Дата 8.9.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



 Так дефолтный делает - копирует поля. Нужно создать массив с такими же размерностями как исходного объекта ( можешь Set вызвать) и скопировать все значения. 

Это сообщение отредактировал(а) Sartorius - 8.9.2010, 20:00
PM MAIL ICQ   Вверх
htzg
Дата 8.9.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Спасибо большое! Сработало! smile

Добавлено через 2 минуты и 45 секунд
Выкладываю окончательный вариант
Код

#include "stdafx.h"
#include <iostream>
#include <vector>

class CProp
{
    public:
        int NDIVIX,NDIVIY,NDIVIZ;
        float ***Values ;
        void Set(int ndiviX, int ndiviY, int ndiviZ)
        {
            ///----------Prop      -------------------
            Values = new float**[ndiviX];
            for(int i=0 ; i < ndiviX; ++i)
            {
                Values[i] = new float*[ndiviY];
                for(int j=0 ; j < ndiviY ; ++j)
                    Values[i][j] = new float[ndiviZ];
            }
            ///---------------------------------------
            ///
            ///------------Prop  inputing-------------
            for(int k=0 ; k < ndiviZ ; ++k)
                for(int j=0 ; j < ndiviY ; ++j)
                    for(int i=0 ; i < ndiviX ; ++i)
                        Values[i][j][k] = 1.0 ;
            ///---------------------------------------
            NDIVIX=ndiviX;
            NDIVIY=ndiviY;
            NDIVIZ=ndiviZ;
        }
        ~CProp();
        CProp(){};
        CProp(const CProp& );
};

CProp::CProp(const CProp& CPr)
{
    NDIVIX = CPr.NDIVIX;
    NDIVIY = CPr.NDIVIY;
    NDIVIZ = CPr.NDIVIZ;
    Values = new float**[NDIVIX];
    for(int i=0 ; i < NDIVIX; ++i)
    {
        Values[i] = new float*[NDIVIY];
        for(int j=0 ; j < NDIVIY ; ++j)
            Values[i][j] = new float[NDIVIZ];
    }
    for(int k=0 ; k < NDIVIX ; ++k)
        for(int j=0 ; j < NDIVIY ; ++j)
            for(int i=0 ; i < NDIVIZ ; ++i)
                Values[i][j][k] = CPr.Values[i][j][k] ;
}

CProp::~CProp()
{
    ///------------Prop destruction-----------
    for(int i=0 ; i < NDIVIX; ++i)
    {
        for(int j=0 ; j < NDIVIY; ++j)
        {
            delete [] Values[i][j] ;
        }
        delete  Values[i] ;
    }
    delete [] Values ;
    ///---------------------------------------
}


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<CProp> vProp;
    for(int i=0;i<3;++i)
    {
        CProp Prop;
        Prop.Set(10,20,5);
        vProp.push_back(Prop);
    }

    char ch;
    std::cin >> ch;

    return 0;
}



PM MAIL   Вверх
bsa
Дата 8.9.2010, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



htzg, вот ты используешь в своей программе вектор. Почему бы его не использовать везде вместо new/delete?
PM   Вверх
htzg
Дата 8.9.2010, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



это, кстати, хороший вопрос!
Элементы данного трех мерного массива в процессе работы программы будут очень часто меняться. Т.е. будут обращения к определенным элементам и присвоение им новых значений. Здесь критична скорость. 
Вопрос: обращение к элементам вектора через функцию at() или iterator будет происходить с такой же скоростью как через указатели в статическом массиве?
По мне так в случае с вектором должно быть медленнее.
Ваше мнение?
PM MAIL   Вверх
mes
Дата 9.9.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(htzg @  8.9.2010,  22:39 Найти цитируемый пост)
 через функцию at() 

через at() будет медленее, так как имеется  проверка на попадание в диапазон
а через оператор[] при включенной оптимизации будет также.


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 9.9.2010, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



> Вопрос: обращение к элементам вектора через функцию at() или iterator будет происходить с такой же скоростью как
через указатели в статическом массиве?
1. Это зависит от реализации STL
2. Думаю эти расходы - ничто по сравнению с расходами самой программы, да и преждевременная оптимизация - корень зла (С) не помню чей ( м.б. Александреску? )
3. Всегда можно взять сначала адрес первого элемента вектора int * p = & array[ 0 ]; а затем использовать p[ i ]


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.