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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2023, 21:40   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Освобождение памяти.

Привет! Вопрос возможно и не нов, но всё же это поставило меня в тупик, есть простой код, вот он:
Код:
#include<windows.h>
#include<iostream>
#include<tchar.h>

#include<stdio.h>
#include<conio.h>

using namespace std;
const wchar_t* aStr[] = { TEXT("Joking"), TEXT("In"), TEXT("Some"),
                        TEXT("Both"), TEXT("Sequension"), TEXT("Lock"),
						TEXT("Lacky"), TEXT("Constante"), TEXT("Friend"),
						TEXT("A"), TEXT("Chery"), TEXT("Go"), 
						TEXT("Pitca"), TEXT("Language"), 
						TEXT("Pragnancy"), TEXT("An"), TEXT("Word"),
						TEXT("Able"), TEXT("Door"), TEXT("Window"),
						TEXT("Live"), TEXT("Ask"), TEXT("Question"),
						TEXT("Wild"), TEXT("Animal"), TEXT("People"),
						TEXT("Girle"), TEXT("Beast"), TEXT("Arm"),
						TEXT("Food")};
const int SIZESTR = sizeof(aStr)/sizeof(aStr[0]);

int main()
{
	int row = 5, col = 6;
	wchar_t** a = (wchar_t**)malloc(row * sizeof(wchar_t*));
	
	for(int i = 0; i < row; ++i)
	{
		a[i] = (wchar_t*)malloc(wcslen(aStr[i])+1);
		//wcscpy_s(a[i], wcslen(aStr[i])+1, aStr[i]);
		lstrcpy(a[i], aStr[i]);
	}
	
	
	
	for(int i = 0; i < row; ++i)
	{
		//for(int j = 0; j < col; ++j)
		//{
			wcout << a[i] << " ";
		//}
		//cout << '\n';
	}
	
	for(int i = 0; i < row; ++i)
	{
		free(a[i]);  //Здесь программа падает.
	}
	free(a);
	a = NULL;
	
	_getch();
	return EXIT_SUCCESS;
}
Суть в том, что, если объявлять массив как char**, то всё работает, если же он объявлен как wchar_t или TCHAR, то при освобождении памяти, вылетает окно с ошибкой.
Цитата:
Windows has triggered a breakpoint in DinamicMem.exe.

This may be due to a corruption of the heap, which indicates a bug in DinamicMem.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while DinamicMem.exe has focus.

The output window may have more diagnostic information.
Если закомментировать операцию копирования символов в выделенную память, то всё проходит замечательно, память выделяется и освобождается, но всё же, хочется разобраться, почему и что происходит, если я копирую данные в выделенную память.
apofioz вне форума Ответить с цитированием
Старый 09.01.2023, 21:51   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

а умножить длину строки на sizeof(wchar_t)
Код:
a[i] = (wchar_t*)malloc(sizeof(wchar_t)*(wcslen(aStr[i])+1));
Вы просто выделяете половину необходимого объема памяти т.к. sizeof(wchar_t) == 2
macomics вне форума Ответить с цитированием
Старый 09.01.2023, 22:39   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Код:
for(int i = 0; i < row; ++i)
	{
		a[i] = (wchar_t*)malloc(wcslen(aStr[i])*sizeof(wchar_t)+1);
		//wcscpy_s(a[i], wcslen(aStr[i])+1, aStr[i]);
		lstrcpy(a[i], aStr[i]);
	}
Так я делал, но тогда ошибка Error.png
apofioz вне форума Ответить с цитированием
Старый 09.01.2023, 22:55   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

а почему +1. '\0' в конце строки тоже должен иметь тип wchar_t и тоже будет занимать 2 байта. Опять выделили на 1 байт меньше.

в моем примере выше +1 тоже умножается на sizeof(wchar_t), а у вас просто прибавляется 1.
macomics вне форума Ответить с цитированием
Старый 09.01.2023, 22:58   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
а почему +1. '\0' в конце строки тоже должен иметь тип wchar_t и тоже будет занимать 2 байта. Опять выделили на 1 байт меньше.
А в вашей версии кода разве не 1 прибавляется?
Хотя вы правы, всё заработало.

Последний раз редактировалось apofioz; 09.01.2023 в 23:12.
apofioz вне форума Ответить с цитированием
Старый 09.01.2023, 23:10   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

У меня +1 взят в скобочки и после все это умножено на sizeof(wchar_t)
macomics вне форума Ответить с цитированием
Старый 09.01.2023, 23:26   #7
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
У меня +1 взят в скобочки и после все это умножено на sizeof(wchar_t)
Бывает, да, не заметил.
А если применяю эту функцию для копирования, то опять ошибка, что за дела(((
Код:
wcscpy_s(a[i], wcslen(aStr[i])*sizeof(wchar_t)+2, aStr[i]);
apofioz вне форума Ответить с цитированием
Старый 10.01.2023, 00:17   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
aStr[i]
не адрес
p51x на форуме Ответить с цитированием
Старый 10.01.2023, 00:58   #9
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
не адрес
А что? Алё, дядя, это ты к чему? Брякнул и свалил.

Последний раз редактировалось apofioz; 10.01.2023 в 03:42.
apofioz вне форума Ответить с цитированием
Старый 10.01.2023, 10:18   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

apofioz, какой, извиняюсь, malloc для C++ . Используй вектор

https://onlinegdb.com/9IpybTplb
Код:
#include <iostream>
#include <string>
#include <vector>

const std::vector<std::wstring> aStr
{
    L"Joking", L"In", L"Some",
    L"Both", L"Sequension", L"Lock",
    L"Lacky", L"Constante", L"Friend",
    L"A", L"Chery", L"Go", 
    L"Pitca", L"Language", 
    L"Pragnancy", L"An", L"Word",
    L"Able", L"Door", L"Window",
    L"Live", L"Ask", L"Question",
    L"Wild", L"Animal", L"People",
    L"Girle", L"Beast", L"Arm",
    L"Food"
};

int main()
{
    auto a=aStr;
    
    for(const auto& i:a)
    {
        std::wcout << i << ' ';
    }
}

Последний раз редактировалось BDA; 10.01.2023 в 14:54.
Алексей1153 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти [Освобождение памяти массива] denis76560 Общие вопросы Delphi 4 27.11.2016 18:20
Освобождение памяти vipok72 Общие вопросы Delphi 30 05.08.2015 00:09
освобождение памяти Homa_1983 Общие вопросы C/C++ 7 31.08.2013 14:36
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23