С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204

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

06.04.2012, 16:09. Показов 2958. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2012, 16:09
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 1 час 2 минуты
Объясните кто все так знает, как верно?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
06.04.2012, 21:26
вам же написали, как верно
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
06.04.2012, 22:33
Цитата Сообщение от HardMorg Посмотреть сообщение
Объясните кто все так знает, как верно?
то что выделено new - освобождается с помощью delete
то что выделено new[] - освобождается с помощью delete[]
разве не логично?
1
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
06.04.2012, 22:41  [ТС]
retmas,
Kuzia domovenok,
Ребята вы уж определитель, один утверждает одно, второй совсем другое....

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

Добавлено через 2 минуты
Понятно что логично ... но я же написал что у меня вылетает так когда использую пользовательскихе классы, хотя если удалить деструктор или объявить его как виртуальный то не вылетало
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.04.2012, 22:56
Почему в классе вашего вектора используется указатель на указатель? Вот так все будет работать
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
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
06.04.2012, 23:16  [ТС]
Toshkarik, мм... ну суть не в том что и как.. просто хочу всякие аспекты понять, это так сказать в научных целях, понятно что использовать лучше std::vector.
Мне так и не сказали то что я спрашивал
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.04.2012, 23:42
Дык дело в том что указатель на указатель можно представить как двумерный массив. А вам нужен одномерный, как и в стандартном векторе. **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
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
06.04.2012, 23:53  [ТС]
Toshkarik, я же снова повторюсь это в научных целях... просто мне нужно реализовать класс(pvector) он должен содержать указатели на обьекты и каждый обьект должен уничтожатся его деструктором.
я понимаю что вы скажите юзай std::vector<shared_ptr<type>> но мне нужно просто реализовать то что просят, понятно что во первых нигде не будет использоваться а во вторых вообще гавнокод.
И меня интересовала конструкция по освобождению памяти я делал for(...) delete []ptr[i]; delete[]ptr

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

Добавлено через 3 минуты
Toshkarik,
Kuzia domovenok,
retmas,
прошу извинения, я просто не понял вас да я был не прав, я понял в чем я ошибся, так протупить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2012, 23:53
Помогаю со студенческими работами здесь

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

Ошибка при освобождении памяти
#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...

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

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

Ошибка при освобождении памяти
Короче, есть простенький метод класса, в котором за полем под названием ID закрепляется новое айди. При это память, в которой хранилось...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru