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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
#1

Ошибка при освобождении памяти - C++

06.04.2012, 16:09. Просмотров 964. Ответов 9
Метки нет (Все метки)

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
#include <iostream>
 
using namespace std;
 
template<class T>
class pvector  {
 
    T **p;
    int sz;
public:
    pvector(int size) {
 
        p = new T*[size];
 
        for(int i  = 0; i < size; i++)
            p[i] = new T();
 
        sz = size;
    }
    
    ~pvector() {
 
        for(int i = 0; i < sz; i++)
            delete[] p[i];
 
        delete[] p;
    }
};
 
 
class My {
 
public:
    My() {
        cout << "My() " << endl;
    }
    
    ~My() {
 
        cout << "~My()" << endl;
    }
    
};
 
int main() {
 
    pvector<My> m(10);
 
}
выбивает ошибку при освобождении памяти ( но если я уберу деструктор класса My не выводит ошибку)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2012, 16:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при освобождении памяти (C++):

Ошибка при освобождении памяти - C++
Здравствуйте. Знаю, что тема уже много раз поднималась в самых разнообразных местах и с очень отличающимися примерами, но, увы, я тоже с...

Ошибка при освобождении памяти - C++
Все идет замечательно, но вот когда происходит удаление массива программа крашится.. #include &lt;iostream&gt; using namespace std; ...

Ошибка при освобождении памяти - C++
Добрый День! Написал простую программу для понимания сути. Проблема в том, что код, который прилагается выдает ошибку. Но если убрать...

Ошибка при освобождении памяти - C++
Здравствуйте, программа завершает работу в этом коде #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cmath&gt; int main() { ...

Ошибка при освобождении памяти? - C++
Доброго времени суток! Я только-только взялся за изучение c++. Дошел до динамической памяти (разбираю по учебнику) и столкнулся с...

Ошибка при освобождении памяти - C++
#include &lt;iostream&gt; using namespace std; #include &lt;stdlib.h&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; void *malloc (size_t...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
06.04.2012, 18:10 #2
строка 25
delete p[i];
1
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
06.04.2012, 20:58  [ТС] #3
igorrr37, можете дать ссылку почитать по этому поводу?
а то я раньше читал где то на просторах интернета что освобождение происходит
C++
1
2
3
4
for(int i = 0; i < sz; i++)
            delete[] p[i];
 
        delete[] p;
интерес даже в том что для простых типов это работает( не знаю на сколько хорошо(если рассматривать из нутри)), и что вообще мне интересно мне если обьявить конструктор My виртуальный, тоже освобождает...

Добавлено через 1 час 2 минуты
Объясните кто все так знает, как верно?
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
06.04.2012, 21:26 #4
вам же написали, как верно
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
06.04.2012, 22:33 #5
Цитата Сообщение от HardMorg Посмотреть сообщение
Объясните кто все так знает, как верно?
то что выделено new - освобождается с помощью delete
то что выделено new[] - освобождается с помощью delete[]
разве не логично?
1
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
06.04.2012, 22:41  [ТС] #6
retmas,
Kuzia domovenok,
Ребята вы уж определитель, один утверждает одно, второй совсем другое....

Kuzia domovenok, ты бы хоть прочитал все мои посты... а то вопрос один ответ совсем другой

Добавлено через 2 минуты
Понятно что логично ... но я же написал что у меня вылетает так когда использую пользовательскихе классы, хотя если удалить деструктор или объявить его как виртуальный то не вылетало
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
06.04.2012, 22:56 #7
Почему в классе вашего вектора используется указатель на указатель? Вот так все будет работать
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
#include <iostream>
 
using namespace std;
 
template<class T>
class pvector  {
 
    T *p;
    int sz;
public:
    pvector(int size) {
 
        p = new T[size];
 
 
 
        sz = size;
    }
 
    ~pvector() {
 
        delete[] p;
    }
};
 
 
class My {
 
public:
    My() {
        cout << "My() " << endl;
    }
 
    ~My() {
 
        cout << "~My()" << endl;
    }
 
};
 
int main() {
 
    pvector<My> m(10);
 
    return 0;
}
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
06.04.2012, 23:16  [ТС] #8
Toshkarik, мм... ну суть не в том что и как.. просто хочу всякие аспекты понять, это так сказать в научных целях, понятно что использовать лучше std::vector.
Мне так и не сказали то что я спрашивал
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
06.04.2012, 23:42 #9
Дык дело в том что указатель на указатель можно представить как двумерный массив. А вам нужен одномерный, как и в стандартном векторе. **p означает: массив указателей на массив указателей на тип T. В вашем же случае нужен массив указателей на тип Т. То есть *p. Если уж нужно сделать двумерный массив, то делайте так же как это делается с std::vector, например
C++
1
std::vector< std::vector<int> > b;
Хотя так вроде не советуют делать...

Добавлено через 15 минут
И да как вам уже сказали,
C++
1
delete p[ i ];
в 25 строчке, если вы хотите чтоб ваш код был рабочий. И Kuzia domovenok, верно сказал, как и все кто выше отписался. Вы выделяли память для объектов с помощью new, а не new [] ( строки 16 - 17 ), так и удаляйте их используя delete а не delete []. Или измените в 17 строчке на
C++
1
p[ i ] = new T[ size ];
я думаю что это и имелось ввиду. Иначе у вас создается массив указателей на массив указателей из одного элемента на Т.
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
06.04.2012, 23:53  [ТС] #10
Toshkarik, я же снова повторюсь это в научных целях... просто мне нужно реализовать класс(pvector) он должен содержать указатели на обьекты и каждый обьект должен уничтожатся его деструктором.
я понимаю что вы скажите юзай std::vector<shared_ptr<type>> но мне нужно просто реализовать то что просят, понятно что во первых нигде не будет использоваться а во вторых вообще гавнокод.
И меня интересовала конструкция по освобождению памяти я делал for(...) delete []ptr[i]; delete[]ptr

но прикол в чем когда я использую вектор для стандартных типов то все норм, но когда для других то при освобождении выкидало ошибку... когда же я убирал дестктор объекта которого храню в векторе, то тогда ошибок не выкидало или объявлял деструктор как вирутальны... и вот мне этот момент интересен

Добавлено через 3 минуты
Toshkarik,
Kuzia domovenok,
retmas,
прошу извинения, я просто не понял вас да я был не прав, я понял в чем я ошибся, так протупить
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2012, 23:53
Привет! Вот еще темы с ответами:

Ошибка при освобождении памяти - C++
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения каждой сроки является символ ‘\n’. Признаком конца текста...

Ошибка при освобождении памяти - C++
Здравствуйте! Пишу на MS Visual C++ 2010, windows 7. При вызове функции resize() на строке delete arr; происходит ошибка,...

Ошибка при освобождении памяти (delete) - C++
Здравствуйте! Есть массив lines, созданный вот так : int *line = new int ; Потом, пытаюсь его удалить и пересоздать : delete...

Ошибка при освобождении памяти массива char* - C++
Класс должен читать слова из файла (C:\\IN.TXT) по одному, и выводить на экран. Почему появляется ошибка в строке 56, и в конце...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.04.2012, 23:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru