Проблема с выделенной памятью в C ++ - PullRequest
0 голосов
/ 10 ноября 2010

Прошло много времени с тех пор, как я программировал на C ++, но недавно я написал небольшую функцию на C ++, и у меня возникли небольшие проблемы. Функция возвращает структуру Result, в которой есть несколько строк. Я думал, что выделил память для строк, но иногда jsonResult частично перезаписывается.

    //The structs
    struct Interp {
         int score;
         char* sentence;
         char* jsonResult;
    };

    struct Result {
         int resultCode;
         char* errorMessage;
         Interp interp;
    };

...

    //Inside the function
    Result result;

    //Store decode
    const char* jsonResult,* sentence;
    if (result.resultCode == -1)
    {
            LVInterpretation interp = port.GetInterpretation(voiceChannel, 0);

            result.interp.score = interp.Score();
            sentence = interp.InputSentence();
            jsonResult = interp.ResultData().Print(SI_FORMAT_ECMA);
    }

    //Allocate memory for strings
    result.interp.jsonResult = new char[strlen(jsonResult) + 1];
    strcpy(result.interp.jsonResult, jsonResult);

    result.interp.sentence = new char[strlen(sentence) + 1];
    strcpy(result.interp.sentence, sentence);

    result.errorMessage = new char[strlen(errorMessage) + 1];
    strcpy(result.errorMessage, errorMessage);

    return result;

Другая информация: Я наблюдаю все это за связыванием python, которое я написал, используя ctypes. Не думайте, что это действительно что-то влияет.

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Используйте std::string. Вы не пожалеете об этом.

1 голос
/ 10 ноября 2010

Я бы положил деньги на твою проблему, находясь здесь:

jsonResult = interp.ResultData().Print(SI_FORMAT_ECMA);

Кто «владеет» массивом char *, возвращаемым Print ()? Может быть, он пытается вернуть указатель на память, которая находится вне области видимости ???

пример:

  char* badFunction(void)
  {
     char test[100];
     strcpy(test,"This is really clever"); // oh, yeah?
     return test; // returns pointer to data that's out of scope
  }

Еще одна вещь. Присваивайте нулевые указатели предложению, jsonResult и т. Д. При их объявлении. В противном случае вы можете получить strcpy () с неинициализированными данными,

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

Пара вещей:

  1. Что означает «частично перезаписано»?Откуда ты это знаешь?то есть каков ваш ожидаемый результат по сравнению с тем, что вы видите?

  2. Не совсем понятно, как result.resultCode установлен в -1 (или если он вообще есть), и если это такустановить, как память распределяется в interp.InputSentence() и interp.ResultData().Print(SI_FORMAT_ECMA)?Я бы предположил, что ваша проблема лежит там

Остальная часть кода должна работать до тех пор, пока jsonResult и sentence содержат допустимые строки с нулевым символом в конце.

...