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

Разобраться с delete [] - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Перевести простую программку с Delphi http://www.cyberforum.ru/cpp-beginners/thread242471.html
Имеется программа на Delphi. Нужно перевести на C++ procedure TForm1.Button1Click(Sender: TObject); var s, sum, i, j, n: integer; p: string; begin s:= 0; sum:= 0; n:=StrToInt(edit1.Text); for i:=1 to n do begin s:= s + 1; p:= IntToStr(s);
C++ Метод простой итерации помогите пожалуйста! решить уравнение методами простой итерации ,касательных и хорд с допустимой погрешностью е=10(в -4 степени).в случае нескольких корней найти наименьший из них. Не злоупотребляйте верхним регистром при написании сообщений! http://www.cyberforum.ru/cpp-beginners/thread242467.html
Different sorts C++
Доброго времени суток, решил проанализировать сортировки. Возникло пару вопросов: 1) Как сделать, чтобы в cout писалось число напр.: 3.343434? 2) Как присвоить копию массива void'у? #include <iostream> #include <time.h> #include <stdlib.h> using namespace std;
C++ Функция alltrim удаляет из строки начальные и конечные пробелы и возвращает указатель на преобразованную строку
Дали задание в ВУЗе. Назначение программы: Функция alltrim удаляет из строки начальные и конечные пробелы и возвращает указатель на преобразованную строку. Функция main вводит исходную строку, обращается к функции alltrim и выводит преобразованную строку, окаймленную звездочками. В процессе тестирования, работу функции проверить на следующих строковых данных: • строка, не содержащая...
C++ Сформировать файл, содержащий данные об учащихся, рост которых меньше среднего http://www.cyberforum.ru/cpp-beginners/thread242385.html
В файле записано данные о росте учеников класса в сантиметрах. Сформировать файл, содержащий данные об учащихся, рост которых меньше среднего.
C++ найти ошибку (строки) Помогите найти ошибку, пожалуйста. условие: прочитать строки из файла, слова-числа записать в массив. Вроде бы все считывается-сортируется без проблем, но на последнем выводе полученного массива оно выдает какую-то чушь оО можете объяснить, в чем дело? int main () { setlocale(LC_ALL,".1251"); ifstream In; подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.02.2011, 00:28     Разобраться с delete []
Строка из матрицы удаляться и не должна - таким оператором вы просто очищаете память, выделенную под данную строку, иными словами, указатель с индексом numberOfRow в массиве указателей matrix будет указывать на память, которую оператор delete[] вернул обратно в кучу. Там могли остаться старые данные, а мог и другой процесс оперативненько занять эту память, и там теперь его данные. Чтобы удалить строку физически (сплющить матрицу, выкинув оттуда строку), надо перевыделить память под новый массив указателей, размером на один меньше предыдущего, скопировать туда все указатели, помимо того, который указывает на удаляемую строку, а затем поменять массивы указателей местами (чтобы matrix указывала на новый массив указателей, а, скажем, какой-нибудь temp - на старую, не модифицированную память) и удалить этот temp. Уфф... Описать это сложнее, чем сделать... Сейчас накидаю что-нибудь сносное.

Добавлено через 21 минуту
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <cstdlib>
#include <ctime>
 
template< typename T >
void delete_row(T **&, size_t &, size_t, size_t);
 
int main()
{
    srand(static_cast< unsigned >(time(0)));
 
    size_t rows = 5, cols = 7;
    int **matrix = new int *[rows];
 
    for (size_t i = 0; i < rows; ++i)
    {
        matrix[i] = new int [cols];
 
        for (size_t j = 0; j < cols; ++j)
            matrix[i][j] = static_cast< int >(-10.0 + 20.0 * rand() / RAND_MAX);
    }
 
    std::cout << "Matrix:" << std::endl;
 
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < cols; ++j)
            std::cout << matrix[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    delete_row(matrix, rows, cols, 1);
    delete_row(matrix, rows, cols, 3);
 
    std::cout << std::endl << "New matrix:" << std::endl;
 
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < cols; ++j)
            std::cout << matrix[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    for (size_t i = 0; i < rows; ++i)
        delete [] matrix[i];
 
    delete [] matrix;
 
    return 0;
}
 
template< typename T >
void delete_row(T **&matrix, size_t &rows, size_t cols, size_t deleted_row)
{
    T **new_matrix = new T *[rows - 1];
 
    for (size_t k = 0, i = 0; k < rows; ++k)
        if (k != deleted_row)
            new_matrix[i++] = matrix[k];
 
    delete [] matrix[deleted_row];
    delete [] matrix;
 
    matrix = new_matrix;
    --rows;
}
 
Текущее время: 18:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru