C ++分配的内存问题

时间:2010-11-09 22:56:14

标签: c++ python memory-management ctypes

自从我用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;

其他信息: 我正在使用ctypes观察我编写的python绑定背后的所有内容。不要认为这确实影响了任何事情。

3 个答案:

答案 0 :(得分:4)

使用std::string。你不会后悔的。

答案 1 :(得分:1)

我会把钱存在你的问题上:

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

谁拥有Print()返回的char *数组?也许它试图返回一个超出范围内存的指针???

示例:

  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()未初始化的数据,

答案 2 :(得分:0)

一些事情:

  1. “部分覆盖”是什么意思?你怎么会知道这事?即你的预期产量与你所看到的相比是什么?

  2. 目前还不清楚result.resultCode如何设置为-1(或者如果它已经设置),如果设置了,如何在interp.InputSentence()和{interp.ResultData().Print(SI_FORMAT_ECMA)中分配内存{1}}?我建议你的问题在那里

  3. 只要jsonResultsentence包含有效的以空字符结尾的字符串,其余代码就应该有效。