我为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
方法中作为参数提供的任何缓冲区。
更新
我一定不够清楚:)。我想要实现的目标:
ClassB b
ClassA a
或char* url
,而不会释放。我知道在这里使用malloc是错误的,这就是为什么我问这个问题,可能摆脱malloc并且“自动”(至少从开发人员编写developerMethod
的角度来看)内存管理
我想这可能很难/不可能实现,但即使这是不可能的,只要让我知道,我会接受这样的答案(如果有人在几天内确认或没有其他答案)。
答案 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()。通过这样做,您可以删除所有其他类引用及其内存,因为您现在独立于该内存。我的第一个答案已经概述了这种方法,但现在你已经将它一直用于“顶级”电话。我很乐意解释更多,但我已经到了很难找到更多解释的地步。