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

Как правильно освободить память - C++

Восстановить пароль Регистрация
 
Koncord
5 / 5 / 1
Регистрация: 27.09.2012
Сообщений: 65
07.04.2014, 19:26     Как правильно освободить память #1
Есть функция char* md5(const char*). Как освободить память выделенную ею?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <openssl\md5.h>
char* md5(const char* text)
{
    unsigned char hash[16];
    char * hashHex = (char*) malloc(32);
    MD5((unsigned char*)text,strlen(text), hash);
    sprintf(hashHex, "%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x",
        hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7],
        hash[8], hash[9], hash[10], hash[11], hash[12], hash[13], hash[14], hash[15]);
    return hashHex;
}
 
int main()
{
    for(int i = 0; i < 10; i++)
    {
        char* hash = md5("123");
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2014, 19:26     Как правильно освободить память
Посмотрите здесь:

как освободить память C++
C++ Как освободить память быстро?
C++ Как правильно освободить память
C++ как освободить память?
C++ Освободить память и записать по новой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
07.04.2014, 19:42     Как правильно освободить память #2
C++
1
free(hash);
Но в С++ принято использовать new-delete
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char* md5(const char* text)
{
    unsigned char hash[16];
    char* hashHex =new char[32];
    MD5((unsigned char*)text,strlen(text), hash);
    sprintf(hashHex, "%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x",
        hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7],
        hash[8], hash[9], hash[10], hash[11], hash[12], hash[13], hash[14], hash[15]);
    return hashHex;
}
 
int main()
{
    for(int i = 0; i < 10; i++)
    {
        char* hash = md5("123");
        delete[] hash;    
    }
 
    return 0;
}
...
Koncord
5 / 5 / 1
Регистрация: 27.09.2012
Сообщений: 65
07.04.2014, 20:19  [ТС]     Как правильно освободить память #3
zss, пытался, на данный код CRT отвечает "CRT detected that the application wrote to memory after end of heap buffer.".
P.S. Так же как и на malloc/free

Добавлено через 22 минуты
Тема закрыта.
C++
1
2
3
4
5
6
7
8
9
char* md5(const char* text)
{
    unsigned char hash[MD5_DIGEST_LENGTH];
    char hashHex[33];
    MD5((unsigned char*)text,strlen(text), (unsigned char*)&hash);
    for(int i = 0; i < 16; i++)
         sprintf(&hashHex[i*2], "%02x", (unsigned int)hash[i]);
    return hashHex;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
07.04.2014, 20:26     Как правильно освободить память #4
Цитата Сообщение от Koncord Посмотреть сообщение
char hashHex[33];...return hashHex;
Нельзя возвращать временный объект.
Koncord
5 / 5 / 1
Регистрация: 27.09.2012
Сообщений: 65
07.04.2014, 20:46  [ТС]     Как правильно освободить память #5
уже понял
C++
1
2
3
4
5
6
7
8
9
char* md5(const char* text)
{
    unsigned char digest[MD5_DIGEST_LENGTH];
    char *hash = new char[33];
    MD5((unsigned char*)text,strlen(text), (unsigned char*)&digest);
    for(int i = 0; i < 16; i++)
         sprintf(&hash[i*2], "%02x", (unsigned int)digest[i]);
    return hash;
}
Yandex
Объявления
07.04.2014, 20:46     Как правильно освободить память
Ответ Создать тему
Опции темы

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