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

Debug Assertion Failed - C++

Восстановить пароль Регистрация
 
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
20.07.2014, 04:52     Debug Assertion Failed #1
Ошибка. Не могу понять что не так. Как я понял с дебагера, проблема во втором освобождении памяти. Вообщем хелп ми)


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  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2014, 04:52     Debug Assertion Failed
Посмотрите здесь:

C++ debug assertion failed
Debug assertion failed C++
ошибка debug assertion failed C++
Debug assertion failed C++
Debug Assertion Failed C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
20.07.2014, 06:29     Debug Assertion Failed #2
C++
1
memcpy(pTemp, pStr, sizeof(int)*n_str);
точно int? Может char?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 07:23     Debug Assertion Failed #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);
Копировать надо не указатели, а сами строки.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
20.07.2014, 08:02  [ТС]     Debug Assertion Failed #4
Цитата Сообщение от Croessmah Посмотреть сообщение
точно int? Может char?
я так и не понял тут int или char???

Добавлено через 1 минуту
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Копировать надо не указатели, а сами строки.
Ничего я не понял, напиши как по твоему правильно будет, плс
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 08:16     Debug Assertion Failed #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);
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
20.07.2014, 08:43  [ТС]     Debug Assertion Failed #6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
strncpy
??? Почему не memcpy?

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

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

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

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

Цитата Сообщение от andreyananas Посмотреть сообщение
Правильное это освобождение памяти?
Правильное.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
20.07.2014, 09:22  [ТС]     Debug Assertion Failed #10
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Кто сказал?
когда вывожу скопированные строки, после слов идет какая то линия...
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 09:33     Debug Assertion Failed #11
Должен добавлять:

http://www.cplusplus.com/reference/i...tream/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.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
20.07.2014, 09:35  [ТС]     Debug Assertion Failed #12
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Должен добавлять:
http://www.cplusplus.com/reference/i...tream/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.
Может копирование удаляет?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,159
Завершенные тесты: 1
20.07.2014, 09:47     Debug Assertion Failed #13
Цитата Сообщение от andreyananas Посмотреть сообщение
memcpy(pTemp, pStr, sizeof(int)*n_str);
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
20.07.2014, 10:46  [ТС]     Debug Assertion Failed #14
Цитата Сообщение от zss Посмотреть сообщение
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
Ну да, и что? Я же вроде не об этом спрашивал.

Добавлено через 40 минут
Объясните что с '\0'
плс
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 11:54     Debug Assertion Failed #15
Цитата Сообщение от andreyananas Посмотреть сообщение
Объясните что с '\0'
Ну так код исправленный где? В исходном я вывода не вижу.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
20.07.2014, 13:16  [ТС]     Debug Assertion Failed #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 Посмотреть сообщение
Ну так код исправленный где? В исходном я вывода не вижу
Вот
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2014, 17:32     Debug Assertion Failed
Еще ссылки по теме:

C++ Debug assertion failed
Debug assertion failed C++
Debug Assertion Failed! C++

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

Или воспользуйтесь поиском по форуму:
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 17:32     Debug Assertion Failed #17
C++
1
2
 for (int j(0); j < 20; ++j)
   cout << pStr[i][j];
Вот тут выводится 20 символов независимо от длины строки. Причем тут ноль?

C++
1
   cout << pStr[i];
Yandex
Объявления
20.07.2014, 17:32     Debug Assertion Failed
Ответ Создать тему
Опции темы

Текущее время: 18:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru