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

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

Войти
Регистрация
Восстановить пароль
 
 
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
#1

Debug Assertion Failed - C++

20.07.2014, 04:52. Просмотров 708. Ответов 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;
}
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 - C++
Создавал небольшой генератор ролей для персонажа и натолкнулся на проблему пиктрелейтед. До определенного момента все работало, пока я не...

debug assertion failed - C++
Помогите пожалуйста,пишет debug assertion failed,когда запускаю .exe, а когда компилирую в программе и запускаю,все отлично идёт,в чем...

Debug Assertion Failed - C++
Привет всем. Написал такую программу. #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 - C++
Во время отладки вылазит такая ошибка,не могу понять в чём дело

Debug assertion failed - C++
Я в с++ делаю первые шаги, так-что прошу сильно не пинать :) При вызове этой функции int qwerty(CComQIPtr &lt;IBody2&gt; pBody) { ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
20.07.2014, 06:29 #2
C++
1
memcpy(pTemp, pStr, sizeof(int)*n_str);
точно int? Может char?
1
uglyPinokkio
326 / 229 / 41
Регистрация: 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
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
20.07.2014, 08:02  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
точно int? Может char?
я так и не понял тут int или char???

Добавлено через 1 минуту
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Копировать надо не указатели, а сами строки.
Ничего я не понял, напиши как по твоему правильно будет, плс
0
uglyPinokkio
326 / 229 / 41
Регистрация: 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
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
20.07.2014, 08:43  [ТС] #6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
strncpy
??? Почему не memcpy?

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

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

Цитата Сообщение от andreyananas Посмотреть сообщение
Так это вообще не нужно делать?
Конечно не нужно
1
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
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
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 09:16 #9
Цитата Сообщение от andreyananas Посмотреть сообщение
Почему cin.getline не ставит в конце строки '\0'
Кто сказал?

Цитата Сообщение от andreyananas Посмотреть сообщение
Правильное это освобождение памяти?
Правильное.
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
20.07.2014, 09:22  [ТС] #10
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Кто сказал?
когда вывожу скопированные строки, после слов идет какая то линия...
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 09:33 #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.
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
20.07.2014, 09:35  [ТС] #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.
Может копирование удаляет?
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
20.07.2014, 09:47 #13
Цитата Сообщение от andreyananas Посмотреть сообщение
memcpy(pTemp, pStr, sizeof(int)*n_str);
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
20.07.2014, 10:46  [ТС] #14
Цитата Сообщение от zss Посмотреть сообщение
Эта операция копирует указатели из pStr в pTemp и, следовательно,
стирает указатели, которые были выделены для pTemp -> потеряли эту память.
Ну да, и что? Я же вроде не об этом спрашивал.

Добавлено через 40 минут
Объясните что с '\0'
плс
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
20.07.2014, 11:54 #15
Цитата Сообщение от andreyananas Посмотреть сообщение
Объясните что с '\0'
Ну так код исправленный где? В исходном я вывода не вижу.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2014, 11:54
Привет! Вот еще темы с ответами:

Debug Assertion Failed! - C++
Доброго времени суток! Не могу понять где ошибка, подскажите пожалуйста. код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

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

Debug Assertion Failed C++ - C++
Здравствуйте. Не могу понять что не так. Выдает ошибку. Помогите разобраться и подправить. #include&lt;string.h&gt; #include&lt;iostream&gt; ...

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


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

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

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