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また、長い文字列である可能性があるため、メソッドで引数として提供されるバッファにコピーしたくありません。

アップデート:

私は十分に明確ではなかったに違いありません:)。私が達成したいこと:

  • ClassB ba.getMyUrl()から戻るとき、メモリに入れたくない
  • 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:
    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 に答える
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);
}

基本的に、char-pointerのコンテンツをクラスの内部メモリからdeveloperMethod()に移動するには、strcpyを使用する必要があることを理解する必要があります。そうすることで、他のすべてのクラス参照とそのメモリから独立しているため、それらのメモリを削除できます。そのアプローチは私の最初の答えですでに概説されています、しかし今あなたはそれを「トップ」コールまでずっと持っています。もっと説明できてうれしいですが、説明するものを見つけるのが難しくなるところまで来ています。

于 2013-01-22T11:55:30.970 に答える