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

деструктор не может очистить память - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Однострочный калькулятор http://www.cyberforum.ru/cpp-beginners/thread541860.html
Вроде бы элементарная программа,но появилось затруднение Программа на Си. Обычный калькулятор(+ - / *). Необходимо следующее: вводится строка: 12+2 подтверждение Enter`ом выводится результат: 14 Вот и всё. Подскажите реализацию.
C++ Создайте модуль, в котором будет храниться процедура создания следующей картинки. Используя модуль, поместите картинку по углам экрана и в центре. Создайте модуль, в котором будет храниться процедура создания следующей картинки. Используя модуль, поместите картинку по углам экрана и в центре. http://www.cyberforum.ru/cpp-beginners/thread541857.html
C++ объясните строку
объясните пожалуйста подробно вторую строку, откуда берутся эти значения? hModule = GetModuleHandle(NULL); SizeFunc=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
C++ Удалить из массива целых чисел все элементы, являющиеся совершенными числами.
нужно сделать сдвиг элементов массива а не затирание этих совершенных чисел пробелом,короче не знаю как помогите пожалуйста очень нужно
C++ массивы http://www.cyberforum.ru/cpp-beginners/thread541829.html
Дано массив A . Следующим правилом построить массив В(7): если массива А элементы І строки расположены по росту степены, тогда к B(I) присваивать 1 число , в обратном случае к B(I) присваивать 0 ;
C++ Найти самое короткое слово начинающаяся с буквы "а" Даны строки символов. Найти самое короткое слово начинающаяся с буквы "а" подробнее

Показать сообщение отдельно
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
07.04.2012, 16:56     деструктор не может очистить память
Всем привет. Ребят, проблема такая. Есть класс который предназначен для хранения двумерной матрицы.
Вот:
C++
1
2
3
4
5
6
7
8
9
class intArr{
    int** arr;
    int xSize, ySize;
public:
    ~intArr();
    intArr(int x, int y, int min, int max);
    void show();
    intArr operator + (intArr&);
};
xSize - кол-во столбцов, ySize - кол-во строк. arr - указатель для хранения матрицы в хипе. Вот конструктор:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
intArr::intArr(int x, int y, int min = -9, int max = 9){
    xSize = x;
    ySize = y;
    arr = new int*[ySize];
    for(int i = 0; i < ySize; i++){
        arr[i] = new int[xSize];
    }
    for(int i = 0; i < ySize; i++){
        for(int j = 0; j < xSize; j++){
            arr[i][j] = rand()%19 - 9;
        }
    }
}
Далее я перегружаю оператор "+". Для этого в описании оператора я создаю новый объект нужной размерности с помощью описанного выше конструктора и в него поэлеметно записываю нужные мне значения элементов матрицы (в данном случае сумму соответсвующих элементов матриц-операндов) и возвращаю этот новый объект на выходе.

C++
1
2
3
4
5
6
7
8
9
intArr intArr::operator +(intArr &a){
    intArr b(xSize, ySize);
    for(int i = 0; i < ySize; i++){
        for(int j = 0; j < xSize; j++){
            b.arr[i][j] = arr[i][j] + a.arr[i][j];
        }
    }
    return b;
}
И всё бы было хорошо если бы не деструктор. Деструктор у меня освобождает память в хипе, выделенную в конструкторе под матрцу.

C++
1
2
3
4
5
6
intArr::~intArr(){
    for(int i = 0; i < ySize; i++){
        delete [] arr[i];
    }
    delete [] arr;
}
Вот мэйн:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(int args, char* arg[])
{   
    srand((unsigned)time(0));
    intArr x(5,3), y(5,3);
    x.show();
    cout<<endl;
    y.show();
    cout<<"---------------------"<<endl;
    x = x + y;
    x.show();
    system("pause");
    return EXIT_SUCCESS;
}
В строке где я пытаюсь сложить 2 матрцы ("x = x + y;") происходит ошибка. Не при компиляции, а уже при работе. И тут два вопроса. Во первых - почему и где в этой строке деструктор вызывается аж 2 раза. И во-вторых - почему во 2ой раз он нормально срабатывать не хочет.

ах да, ошибка - Unhandled exception at 0x60c831ea in draft.exe: 0xC0000005: Access violation reading location 0xfeeefee2.

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