0

我为 Arduino 设备编写程序,但问题很普遍(我认为)。

假设我有以下代码:

char* ClassB::generateUrl()
{
    char* someString = (char*) malloc(...);
    // something...
    return someString;
}

char* ClassA::getMyUrl()
{
    ClassB b;
    return b.generateUrl();
}

void developerMethod()
{
    ClassA a;
    char* url = a.getMyUrl();
    print(url);
}

在这种情况下,使用的开发人员ClassA::getMyUrl必须记住释放为 url 分配的内存。有没有更人性化的方式来做到这一点? 重要提示:由于 Arduino 板上的内存限制,我不想返回整个ObjectB,只返回它生成的内容。而且因为它可能是长字符串,我不想将它复制到getMyUrl方法中提供的任何缓冲区作为参数。

更新:

我一定不够清楚:)。我想要达到的目标:

  • 从 a.getMyUrl() 返回时,我不想ClassB b在内存中
  • 从 developerMethod 返回时,我不想在没有释放的情况下既没有ClassA a也没有 在内存中。char* url
  • 可能在字符串上使用 char*

我知道在这里使用 malloc 是错误的,这就是为什么我问这个问题,可能摆脱 malloc 并具有“自动”(至少从开发人员写作的角度来看developerMethod)内存管理。

我想这可能很难/不可能实现,但即使不可能,也请告诉我,我会接受这样的答案(如果有人确认或几天后没有其他答案出现)。

4

3 回答 3

6

如果你想在 C++ 中使用字符串,只需使用std::string. 一旦你这样做了,你就不必为这样的事情而烦恼。
而这正是 C++ 拥有std::string.

于 2013-01-21T15:38:14.210 回答
0

这里是:

 class ClassB
 {
 public:

    ClassB()
    {
        strcpy(_someString, "my_url");
    }

    void generateUrl(char *url)
    {
        strcpy(url, _someString);

        //char* someString = (char*) malloc(...);
        // something...
        //return someString;
    }
private:
    char _someString[80];
};

class ClassA{
public:
    void getMyUrl(char *url)
    {
        ClassB b;
        b.generateUrl(url);
        //return b.generateUrl();
    }
};

void developerMethod()
{
    ClassA a;
    //char* url = a.getMyUrl();
    char url[80];
    a.getMyUrl(url);
    print(url);
}

本质上,您必须了解您需要使用 strcpy 将字符指针的内容从类的内部内存移动到 developerMethod()。通过这样做,您可以删除所有其他类引用及其内存,因为您现在独立于该内存。我的第一个答案中已经概述了这种方法,但是现在您已经将其一直到“顶部”调用。我很乐意解释更多,但我已经到了难以找到更多解释的地步。

于 2013-01-22T11:55:30.970 回答
0

这应该这样做:

class ClassB {
public:
    void setUrl(char *url){strncpy(url_, url, 80);}
    char *getUrl(char *url){return url_;}
private:
    char[80] url_; 
};

class ClassA 
{ 
public:
   char *getUrl(){return classB.getUrl();}
private:
    ClassB classB; 
};

ClassA classA;

void setup()
{

}

void loop()
{
    char *url = classA.getUrl();
    Serial.println(url);
    delay(1000);
}

如果这对您没有帮助,请向我们提供更多详细信息,说明您正在尝试实现的目标,而此代码示例未涵盖该目标。为什么一个班一个班?为什么要使用malloc?...

于 2013-01-21T16:10:34.257 回答