утечка памяти встроенной функции - PullRequest
3 голосов
/ 10 ноября 2011

У меня есть встроенная функция, определенная следующим образом:

inline string Change(char *pointer) {
    string str;
    char temp[32] = "";

    sprintf(temp,"%c:%c:%c:%c:%c:%c", //line 1
        temp[0],temp[1],temp[2],
        temp[3],temp[4],temp[5],
    );

    str = temp;
    return str;
}

, когда я использую инструмент проверки утечки памяти, чтобы проверить это, это указывает, что строка 1 (отмеченная выше) является утечкой памяти.В чем проблема вышеуказанного кода?

Ответы [ 6 ]

2 голосов
/ 24 ноября 2011

Если вы хотите точно знать, где находится утечка, вы можете использовать плагины. Вы можете выбрать плагин>, который будет удобен для вас. Для меня это делакер. В этой области так много событий !!

Спасибо. Это помогло мне.

2 голосов
/ 22 ноября 2011

Если вы хотите точно знать, где находится утечка, вы можете использовать плагины. Вы можете выбрать плагин, который будет удобен для вас. Для меня это делакер. В этой области так много разработок !!

2 голосов
/ 10 ноября 2011

Я создал полностью компилируемый пример:

#include <string>
#include <iostream>
#include <cstdio>

std::string Change( char * ) {
    std::string str;
    char temp[32] = "";

    sprintf(temp,"%c:%c:%c:%c:%c:%c", //line 1
        temp[0],temp[1],temp[2],
        temp[3],temp[4],temp[5]
    );

    str = temp;
    return str;
}

int main()
{
    char a[]={"abaaaaa2"};
    std::cout<<Change(a)<<std::endl;
}

При работе под Valgrind утечки не обнаруживаются:

==16829== 
==16829== HEAP SUMMARY:
==16829==     in use at exit: 0 bytes in 0 blocks
==16829==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==16829== 
==16829== All heap blocks were freed -- no leaks are possible
==16829== 
==16829== For counts of detected and suppressed errors, rerun with: -v
==16829== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 8)
1 голос
/ 10 ноября 2011

Приведенный выше код не имеет утечки.Инструмент может указывать на утечку в любом из двух случаев:

  1. строка, возвращаемая из функции, назначается где-то другой строковой переменной, и эта другая переменная не уничтожается до запуска инструмента - тогда техническитело строки все еще выделяется в этой точке, и инструмент сообщает об этом
  2. распределитель тела строки кэшировал блок тела строки для последующего повторного использования, и инструмент запускается до того, как распределитель освободит все кэшированные блоки - затем технически снова строкатело выделено, и инструмент сообщает об этом.
0 голосов
/ 10 ноября 2011

инструмент неисправен;там нет утечки памяти.

0 голосов
/ 10 ноября 2011

Утечка памяти происходит только тогда, когда вы получаете свободную память магазина с помощью new или new [] и не освобождаете ее, вызывая delete или delete[] соответственно.

std::string внутренне выделяет на freestore, но вы возвращаете его как тип возврата, и это не утечка памяти.

Код, который вы показали, не использует new или new [], поэтому в коде, который вы показываете, нет утечки памяти.
Инструмент, который вы используете, кажется, вводит в заблуждение. или вам нужно показать нам свой реальный код, чтобы получить лучший ответ.

...