0

どうすればこれを行うことができますか。

char* ToString(int num) {

    char* str = new char[len(num)];

    //conversion

    return str;

}

そしてこれを呼ぶことによって。

string someStr = ToString(someInt);

ここを解放する必要がありsomeStrますか?

私は私が使用するdeleteときはいつでも私が常にする必要があることを知っていますnew

また、この関数を複数回呼び出した場合、メモリを割り当てて、使用せずにそのままにしておくとどうなりますか?

4

5 に答える 5

3

この慣習は完全に避けるべきです。を返すか、直接std::unique_ptr処理しstd::stringます。あなたのコードからは、あなたが何をしようとしているのかが明確ではないため、具体的な解決策を提供することはできません.

この初期化に注意してください。

string someStr = ToString(someInt);

null で終わる文字列を返す場合にのみ正しく機能しますが、リソースをリークします。

この関連記事を参照してください。

于 2013-02-05T12:00:12.197 に答える
1

deleteへの呼び出しごとに 1 回呼び出す必要がありますToStringstd::stringまた、質問が示唆する方法で割り当てられた配列でa を初期化することはできません。これcharにより、返されたメモリがリークし、someStr変数がコピーされます。

最も簡単で適切な方法は、代わりToStringに returnに変更することです。std::stringこの場合、呼び出し元の変数がスコープ外になると、文字列によって使用されるメモリは自動的に削除されます。

于 2013-02-05T12:00:02.680 に答える
1

あなたのコードを valgrind で実行したところ、メモリ リークのサイズが--leak-check=full報告されました。num

Call new/deletenew [] /delete []ペアでメモリを循環させる唯一の方法です。

整数型を文字列に変換する場合、C++ にはいくつかのオプションがあります。

// std::to_string(C++11) e.g:
{
    std::string str = std::to_string(num)
}
// std::stringstream     e.g:
{
    std::string str;
    std::stringstream ss;
    ss << num;
    ss >> str;
}
// boost::lexical_cast   e.g:
{
    std::string str = boost::lexical_cast<std::string>(num);
}
// itoa(c function)
{
    char buf[MAX_INT_DIGITS]; // MAX_INT_DIGITS == 12 ("-2147483648\0")
    itoa(num, buf, 10);
    std::string str(buf);
}
于 2013-02-05T12:08:32.817 に答える
0

関数はstd::stringを返す必要があります。ToStringその後、値をstd::stringに割り当てるだけです。ここで動的に割り当てられたメモリを処理する理由はありません。

于 2013-02-05T11:59:56.813 に答える
0

someStrはコピーです。すでにリークがあります。返されたポインタの値を一時的に保存し、文字列を作成した後に削除する必要があります。これは通常、スマート ポインターの仕事です。

編集:いいえ、

char* temp =  strs; delete [] str; return temp;

何か未定義になります。しかし:

char* temp =ToString(someInt);  string someStr(temp);delete []temp;

動作します。しかし、これはあなたがその考えを理解するためだけのものです。これは、unique_ptr を返す場合に作成できます。そして、これは、後で解放されなければならないメモリを返すという一種の一般的な質問であると想定していunique_ptrますshared_ptr。この特定のケースでは、文字列を作成して変更し、単純に返すことができます。すべてのメモリ管理は文字列クラスによって行われます。文字列に「スペース」を割り当てるだけで十分な場合は、次のようにします。

String Str; Str.reserve(len(num));
于 2013-02-05T12:00:47.170 に答える