Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2016, 07:57   #1
max.krejjk
 
Регистрация: 20.05.2016
Сообщений: 9
Печаль Помогите найти ошибку heap corruption detected

Код:
struct Info
{
	Info() : total(0), fileIndex(0), code(0) {}
	char code;
	size_t fileIndex, total;
};
int minStart, minLen = 255, len = 0, num =0;
using namespace std;
int var1(void) {
	SetConsoleOutputCP(1251);
	char *path = {};
	path = new char;
	printf("Введите полный путь к файлу: \n");
	cin >> path;
	ifstream ifs1(path);
	if (ifs1.is_open())
	{
		char c;
		unsigned char arrInd;
		const size_t size = 256;
		Info arr[size];
		for (size_t cntr = 0; ifs1.get(c); ++cntr)
		{
			arrInd = c;
			if (0 == arr[arrInd].total)
			{
				arr[arrInd].fileIndex = cntr;
				arr[arrInd].code = c;
			}
			++arr[arrInd].total;
		}
		sort(arr, arr + size, [](const Info& x, const Info& y) {return x.fileIndex < y.fileIndex; });
		for (auto const& p : arr)
		{
			if (1 == p.total)
			{
				cout << p.code << endl;
			}
		}
	}
	else cerr << "Не могу открыть файл. Проверьте правильность пути\n";
	ifs1.close();
	free(path);
	return 0;
}
На строке free(path); выдаёт ошибку HEAP CORRUPTION DETECTED. Но в этой строке и последующих я не обращаюсь к данным. Помогите пожалуйста!
max.krejjk вне форума Ответить с цитированием
Старый 08.07.2016, 08:05   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Код:
	char *path = {};
Зачем?

Код:
path = new char;
Вы уверены, что одного символа хватит для всего пути к файлу?

Код:
free(path);
Для new пара delete, а не free.
p51x вне форума Ответить с цитированием
Старый 08.07.2016, 10:26   #3
max.krejjk
 
Регистрация: 20.05.2016
Сообщений: 9
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
	char *path = {};
Зачем?

Код:
path = new char;
Вы уверены, что одного символа хватит для всего пути к файлу?
Незнаю ЧЯДНТ, но работает. Там компилятор похоже преобразует char в массив char, а это вроде как спасает.

Код:
free(path);
Для new пара delete, а не free.

Спасибо, исправил. Но ошибка осталась.

HEAD CORRUPTION DETECTED: after Normal block (#182) at 0x00B68840.

Могу привести полный текст программы:
Код:
#define _CRT_SECURE_NO_WARNINGS
#define STRLEN 255
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <locale.h>
#include <algorithm>
#include <iostream>
#include <fstream>

struct Info
{
	Info() : total(0), fileIndex(0), code(0) {}
	char code;
	size_t fileIndex, total;
};
int minStart, minLen = 255, len = 0, num =0;
using namespace std;
int var1(void) {
	SetConsoleOutputCP(1251);
	char *path = {};
	path = new char;
	printf("Введите полный путь к файлу: \n");
	cin >> path;
	ifstream ifs1(path);
	if (ifs1.is_open())
	{
		char c;
		unsigned char arrInd;
		const size_t size = 256;
		Info arr[size];
		for (size_t cntr = 0; ifs1.get(c); ++cntr)
		{
			arrInd = c;
			if (0 == arr[arrInd].total)
			{
				arr[arrInd].fileIndex = cntr;
				arr[arrInd].code = c;
			}
			++arr[arrInd].total;
		}
		sort(arr, arr + size, [](const Info& x, const Info& y) {return x.fileIndex < y.fileIndex; });
		for (auto const& p : arr)
		{
			if (1 == p.total)
			{
				cout << p.code << endl;
			}
		}
	}
	else cerr << "Не могу открыть файл. Проверьте правильность пути\n";
	ifs1.close();
	delete(path);
	return 0;
}
int var2(void) {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	printf("Вариант 2 \n");	
	char *str = {};
	char *path1;
	path1 = new char;
	string s;
	cin >> path1;
	ifstream ifs2(path1);
	int repeat;
	int min_length = 2000000000;
	for (unsigned int i = 0; i < s.length(); i++)
		if (s[i] != ' ')
		{
			int start_index = i;
			while (i != s.size() && s[i] != ' ')
				i++;
			if (i - start_index == min_length)
				repeat++;
			if (i - start_index < min_length)
			{
				repeat = 1;
				min_length = i - start_index;
				string str = s.substr(start_index, i - start_index);
			}
		}
	printf("Количество наименьших слов: %s\n", char(repeat));
	return 0;
}
int var3(void) {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	printf("Вариант 3 \n");
	printf("Введите полный путь к файлу: \n");
	char *path = {};
	path = new char;
	fgets(path, STRLEN, stdin);
	ifstream ifs3(path);
	char *InputText = {};
	int length;
	char Sign;
	ifs3.seekg(0, ios::end);
	length = ifs3.tellg();
	int WordsCount, i;              // кол-во слов с указанной буквы; счётчик
	char PrevSign;                   // предыдущий (I - 1)-ый символ
					 // инициализация
	PrevSign = ' ';
	WordsCount = 0;

	// получаем частоты всех первых символов
	for (i = 0; length;InputText[i]) {
		ifs3.get(Sign);
		if ((InputText[i] == Sign) && (PrevSign == ' ')) {
			++WordsCount;
		}
	PrevSign = InputText[i];
	}
	printf("Таких слов: %d \n", WordsCount);
	free(path);
	return 0;
}
int var4(void) {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	printf("Вариант 4 \n");
	char str[STRLEN], *p;
	size_t count_all, count_word;
	printf("Строка: \n");
	fgets(str, STRLEN, stdin);
	int nofn;
		nofn = 0;
		count_all = count_word = 0;
		for (p = strtok(str, " "); p != NULL; p = strtok(NULL, " ")) {
			++count_all;
		}
		for (unsigned int i = 0; i < strlen(str); i++)
			if (str[i] >= 48 && str[i] <= 57) {
				++nofn;
			}
	printf("Всего слов: %d\n", count_all);
	printf("Всего чисел: %d\n", nofn);
	system("pause");
	exit(0);
}
int main(void)
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	printf("Введите номер задания: \n");
	int sde;
	cin >> sde;
	switch ( sde )
	{
	case 1:
		var1();
		break;
	case 2:
		var2();
		break;
	case 3:
		var3();
		break;
	case 4:
		var4();
		break;
	}
}
max.krejjk вне форума Ответить с цитированием
Старый 08.07.2016, 10:35   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Цитата:
Незнаю ЧЯДНТ, но работает. Там компилятор похоже преобразует char в массив char, а это вроде как спасает.
Не преобразует и не спасает. Вы просто пишите за границей буфера. Т.к. там еще у вас есть права, то и ошибку по доступу не получаете, а вот heap corruption ловите.
p51x вне форума Ответить с цитированием
Старый 08.07.2016, 10:45   #5
max.krejjk
 
Регистрация: 20.05.2016
Сообщений: 9
По умолчанию

Спасибо

Последний раз редактировалось max.krejjk; 08.07.2016 в 10:49.
max.krejjk вне форума Ответить с цитированием
Старый 08.07.2016, 11:13   #6
max.krejjk
 
Регистрация: 20.05.2016
Сообщений: 9
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Не преобразует и не спасает. Вы просто пишите за границей буфера. Т.к. там еще у вас есть права, то и ошибку по доступу не получаете, а вот heap corruption ловите.
Код:
int var2(void) {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	printf("Вариант 2 \n");
	char *str[STRLEN];
	char *path1;
	path1 = new char[STRLEN];
	printf("Введите путь к файлу:");
	cin >> path1;
	ifstream ifs(path1);
	string s(
		(istreambuf_iterator<char>(ifs))
		, istreambuf_iterator<char>());
	int repeat;
	delete(path1);
	int min_length = 2000000000;
	for (unsigned int i = 0; i < s.length(); i++)
		if (s[i] != ' ')
		{
			int start_index = i;
			while (i != s.size() && s[i] != ' ')
				i++;
			if (i - start_index == min_length)
				repeat++;
			if (i - start_index < min_length)
			{
				repeat = 1;
				min_length = i - start_index;
				string str = s.substr(start_index,min_length);
			}
		}
	printf("Количество наименьших слов: %s\n", repeat);
	return 0;
}
А в этой части ошибка возникает на строке string str = s.substr(start_index,min_length);
Помогите ещё раз пожалуйста :D
Похоже это опять выход за границу массива, но я не могу понять почему.

UPD: строка string str = s.substr(start_index,min_length); не при чём
UPD2: нашёл ошибку :D. Осталось поправить вывод слова в злополучной строке string str = s.substr(start_index,min_length);

Последний раз редактировалось max.krejjk; 08.07.2016 в 11:25.
max.krejjk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
*** glibc detected *** double free or corruption Stilet Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 2 13.05.2014 20:50
GetDIBits пишет за буфеер => Heap corruption detected. TwiX Win Api 2 16.11.2013 22:27
Corruption of the heap при вызове деструктора pure Общие вопросы C/C++ 1 30.11.2010 21:09
Heap Corruption при попытке перевыделить память под массив внутри структуры Farrel Общие вопросы C/C++ 1 21.04.2010 00:45
HEAP CORRUPTION удаляю массив delias Общие вопросы C/C++ 1 10.12.2009 10:17