Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880

Debug Assertion Failed

20.07.2014, 04:52. Показов 1497. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ошибка. Не могу понять что не так. Как я понял с дебагера, проблема во втором освобождении памяти. Вообщем хелп ми)


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
// hw_3.cpp : Defines the entry point for the console application.
// Пользователь вводит строки пока не надоест
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
     int str_size = 100, n_str = 4, Index_pc(0);
     char ** pStr = new char*[n_str];
     for (int i(0); i < n_str; ++i)
         pStr[i] = new char[str_size];
 
     while (true)
     {
         cin.getline(pStr[Index_pc++], str_size);
         if (Index_pc == n_str)
         {
             char ** pTemp = new char*[n_str + n_str / 2];
            for (int i(0); i < n_str + n_str / 2; ++i)
                 pTemp[i] = new char[str_size];
 
             memcpy(pTemp, pStr, sizeof(int)*n_str);
 
             for (int i(0); i < n_str; ++i)
                 delete[] pStr[i];
             delete[] pStr;
 
             pStr = pTemp;
             cout << " memalloc old size " << n_str << " new " << n_str + n_str / 2 << endl;
             n_str += n_str / 2;
         }
     }
    return 0;
}
Миниатюры
Debug Assertion Failed  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.07.2014, 04:52
Ответы с готовыми решениями:

Debug Assertion Failed
Привет всем. Написал такую программу. #include &lt;stdio.h&gt; int n, m; int i, q, d; void merge(int a, int b, int c, int n, int...

Debug assertion failed
Приветствую! Не могу найти ошибку в функции readn, которая должна: считывать сначала размерность матрицы из файла, потом выделять память...

Debug assertion failed
Здравствуйте! Есть 2 двусвязных списка. Нужно написать метод merge который эти списки соединяет. Сам метод я написал. Запускаю, ввожу...

16
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
20.07.2014, 06:29
C++
1
memcpy(pTemp, pStr, sizeof(int)*n_str);
точно int? Может char?
1
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 07:23
Цитата Сообщение от andreyananas Посмотреть сообщение
Не могу понять что не так.
Заводим массив указателей на строки и строки.

C++
1
2
3
 char ** pTemp = new char*[n_str + n_str / 2];
            for (int i(0); i < n_str + n_str / 2; ++i)
                 pTemp[i] = new char[str_size];
Копируем старый массив указателей, при этом теряем память, отведенную выше

C++
1
memcpy(pTemp, pStr, sizeof(int)*n_str);
После чего старые строки удаляем, но указатели на них уже скопированы в pTemp.

C++
1
2
for (int i(0); i < n_str; ++i)
                 delete[] pStr[i];
На следующей итерации эти же строки будут удаляться еще раз.

Вто тут:

C++
1
memcpy(pTemp, pStr, sizeof(int)*n_str);
Копировать надо не указатели, а сами строки.
1
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 08:02  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
точно int? Может char?
я так и не понял тут int или char???

Добавлено через 1 минуту
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Копировать надо не указатели, а сами строки.
Ничего я не понял, напиши как по твоему правильно будет, плс
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 08:16
Цитата Сообщение от andreyananas Посмотреть сообщение
Ничего я не понял
Вот тут ты копируешь только адреса строк:

C++
1
memcpy(pTemp, pStr, sizeof(int)*n_str);
Вместо этого надо копировать данные:

C++
1
2
for (int i=0; i < n_str; ++i)
   strncpy(pTemp[i],pStr[i],str_size);
1
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 08:43  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
strncpy
??? Почему не memcpy?

Добавлено через 1 минуту
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
memcpy(pTemp, pStr, sizeof(int)*n_str);
Так это вообще не нужно делать?

Добавлено через 15 минут
ВООБЩЕМ ВСЕ ПОПРОБОВАЛ, НИЧЕГО НЕ ПОМОГАЕТ(((
ХЕЛП)
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 08:47
Цитата Сообщение от andreyananas Посмотреть сообщение
Почему не memcpy?
Ну можешь memcpy, для копирования строк обычно используют strncpy, она не копирует лишнего.

Цитата Сообщение от andreyananas Посмотреть сообщение
Так это вообще не нужно делать?
Конечно не нужно
1
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 09:04  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Конечно не нужно
Заработало, спс) правда это все меня немного запутало.
Почему cin.getline не ставит в конце строки '\0' ??? Самому нужно ставить???

Добавлено через 2 минуты
C++
1
2
3
             for (int i(0); i < n_str; ++i)
                 delete[] pStr[i];
             delete[] pStr;
Правильное это освобождение памяти?
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 09:16
Цитата Сообщение от andreyananas Посмотреть сообщение
Почему cin.getline не ставит в конце строки '\0'
Кто сказал?

Цитата Сообщение от andreyananas Посмотреть сообщение
Правильное это освобождение памяти?
Правильное.
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 09:22  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Кто сказал?
когда вывожу скопированные строки, после слов идет какая то линия...
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 09:33
Должен добавлять:

http://www.cplusplus.com/refer... m/getline/


A null character ('\0') is automatically appended to the written sequence if n is greater than zero, even if an empty string is extracted.
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 09:35  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Должен добавлять:
http://www.cplusplus.com/refer... m/getline/
A null character ('\0') is automatically appended to the written sequence if n is greater than zero, even if an empty string is extracted.
Может копирование удаляет?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
20.07.2014, 09:47
Цитата Сообщение от andreyananas Посмотреть сообщение
memcpy(pTemp, pStr, sizeof(int)*n_str);
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 10:46  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
Ну да, и что? Я же вроде не об этом спрашивал.

Добавлено через 40 минут
Объясните что с '\0'
плс
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 11:54
Цитата Сообщение от andreyananas Посмотреть сообщение
Объясните что с '\0'
Ну так код исправленный где? В исходном я вывода не вижу.
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 13:16  [ТС]
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
// hw_3.cpp : Defines the entry point for the console application.
// Пользователь вводит строки пока ненадоест
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
     int str_size = 100, n_str = 4, Index_pc(0);
     char ** pStr = new char*[n_str];
     for (int i(0); i < n_str; ++i)
         pStr[i] = new char[str_size];
 
     while (true)
     {
         cin.getline(pStr[Index_pc++], str_size);
         if (Index_pc == n_str)
         {
             char ** pTemp = new char*[n_str + n_str / 2];
             for (int i(0); i < n_str + n_str / 2; ++i)
                 pTemp[i] = new char[str_size];
 
             for (int i(0); i < n_str; ++i)
                 memcpy(pTemp[i], pStr[i], sizeof(char)*str_size);
 
 
             for (int i(0); i < n_str; ++i)
                 delete[] pStr[i];
             delete[] pStr;
 
             pStr = pTemp;
             for (int i(0); i < n_str; ++i)
             {
                 for (int j(0); j < 20; ++j)
                     cout << pStr[i][j];
                 cout << endl;
             }
             cout << " memalloc old size " << n_str << " new " << n_str + n_str / 2 << endl;
             n_str += n_str / 2;
         }
 
     }
 
         return 0;
}
Добавлено через 11 минут
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Ну так код исправленный где? В исходном я вывода не вижу
Вот
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 17:32
C++
1
2
 for (int j(0); j < 20; ++j)
   cout << pStr[i][j];
Вот тут выводится 20 символов независимо от длины строки. Причем тут ноль?

C++
1
   cout << pStr[i];
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.07.2014, 17:32
Помогаю со студенческими работами здесь

Debug assertion failed
#include &lt;iostream&gt; using namespace std; class Employee { friend class Leader; private: char m_name; char m_no; public: ...

Debug assertion failed
Здравствуйте, ошибка выскакивает, как решить? Выскакивает при входе в конструктор класса ниже //Класс для создания...

Debug assertion failed
Проблема при попытке релиза, дебажится при этом нормально, объясните мне, что может быть не так, где искать баги. (скрин ниже) ...

Debug Assertion Failed
Создавал небольшой генератор ролей для персонажа и натолкнулся на проблему пиктрелейтед. До определенного момента все работало, пока я не...

Debug Assertion Failed!
Доброго времени суток. Имеется код: #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main() { setlocale(LC_ALL,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru