安全地返回指向本地对象成员的指针

时间:2013-01-21 15:36:27

标签: c++ memory return arduino

我为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 achar* url,而不会释放。
  • 可能使用char * over String

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

我想这可能很难/不可能实现,但即使这是不可能的,只要让我知道,我会接受这样的答案(如果有人在几天内确认或没有其他答案)。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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? ...

答案 2 :(得分: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来将char-pointer的内容从你的类的内部存储器移动到developerMethod()。通过这样做,您可以删除所有其他类引用及其内存,因为您现在独立于该内存。我的第一个答案已经概述了这种方法,但现在你已经将它一直用于“顶级”电话。我很乐意解释更多,但我已经到了很难找到更多解释的地步。