安全返回指向局部对象成员的指针

Safely return pointer to member of local object

本文关键字:成员 指针 对象 局部 返回 安全      更新时间:2023-10-16

我为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.t getmyurl()返回时,我不想在内存中有ClassB b
  • 当从developerMethod返回时,我不想在内存中既没有ClassA a也没有char* url,没有释放。
  • 可能在String
  • 上使用char*

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

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

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

如下:

 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()中。通过这样做,您可以删除所有其他类引用及其内存,因为您现在独立于该内存。这种方法已经在我的第一个答案中概述了,但现在您已经将其一直用于"顶部"调用。我很乐意解释更多,但我已经到了很难找到更多解释的地步了。

应该这样做:

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?div…