27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
1

Debug Assertion Failed

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

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


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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2014, 04:52
Ответы с готовыми решениями:

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

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

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

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

16
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
20.07.2014, 06:29 2
C++
1
memcpy(pTemp, pStr, sizeof(int)*n_str);
точно int? Может char?
1
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 07:23 3
Цитата Сообщение от 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
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 08:02  [ТС] 4
Цитата Сообщение от Croessmah Посмотреть сообщение
точно int? Может char?
я так и не понял тут int или char???

Добавлено через 1 минуту
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Копировать надо не указатели, а сами строки.
Ничего я не понял, напиши как по твоему правильно будет, плс
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 08:16 5
Цитата Сообщение от 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
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 08:43  [ТС] 6
Цитата Сообщение от 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 7
Цитата Сообщение от andreyananas Посмотреть сообщение
Почему не memcpy?
Ну можешь memcpy, для копирования строк обычно используют strncpy, она не копирует лишнего.

Цитата Сообщение от andreyananas Посмотреть сообщение
Так это вообще не нужно делать?
Конечно не нужно
1
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 09:04  [ТС] 8
Цитата Сообщение от 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 9
Цитата Сообщение от andreyananas Посмотреть сообщение
Почему cin.getline не ставит в конце строки '\0'
Кто сказал?

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

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
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 09:35  [ТС] 12
Цитата Сообщение от 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
Модератор
Эксперт С++
13496 / 10751 / 6406
Регистрация: 18.12.2011
Сообщений: 28,688
20.07.2014, 09:47 13
Цитата Сообщение от andreyananas Посмотреть сообщение
memcpy(pTemp, pStr, sizeof(int)*n_str);
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
0
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 10:46  [ТС] 14
Цитата Сообщение от zss Посмотреть сообщение
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
Ну да, и что? Я же вроде не об этом спрашивал.

Добавлено через 40 минут
Объясните что с '\0'
плс
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 11:54 15
Цитата Сообщение от andreyananas Посмотреть сообщение
Объясните что с '\0'
Ну так код исправленный где? В исходном я вывода не вижу.
0
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
20.07.2014, 13:16  [ТС] 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 17
C++
1
2
 for (int j(0); j < 20; ++j)
   cout << pStr[i][j];
Вот тут выводится 20 символов независимо от длины строки. Причем тут ноль?

C++
1
   cout << pStr[i];
1
20.07.2014, 17:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2014, 17:32
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru