安全返回指向局部对象成员的指针
Safely return pointer to member of local object
我为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…
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制