2

C++の次のソースコードを検討してください

vector <char *> myFunction()
{
    vector <char *> vRetVal;
    char *szSomething = new char[7];

    strcpy(szSomething,"Hello!");
    vRetVal.push_back(szSomething); // here vRetVal[0] address == &szSomething

    delete[] szSomething; // delete[]ing szSomething will "corrupt" vRetVal[0]
    szSomething = NULL;

    return vRetVal; // here i return a "corrupted" vRetVal
}

push_backを使用して、参照で取得する代わりに、渡したパラメーターのコピーを作成する方法について何かアイデアはありますか?他のアイデアも受け入れられ、高く評価されています。

4

4 に答える 4

7

ベクトルへのポインターをプッシュしたオブジェクトはdelete、コード内のステートメントによって破棄されます。つまり、ベクター内のアイテム(ポインター)は、削除されたオブジェクトを指しています。あなたはそれを望まないと確信しています。

使用std::string

std::vector<std::string> myFunction()
{
    std::vector<std::string> v;
    v.push_back("Hello"); 
    v.push_back("World");
    return v;
}

C ++ 11では、次のように書くことができます。

std::vector<std::string> myFunction()
{
   std::vector<std::string> v{"Hello", "World"};
   return v;
}

またはこれ、

std::vector<std::string> myFunction()
{
   return {"Hello", "World"};
}
于 2012-11-18T18:54:27.043 に答える
3

push_back 渡したパラメータのコピーを作成します

ただし、パラメータはポインタであり、文字列自体ではありません。

文字列を自動的にコピーするには、を使用しますstd::string

于 2012-11-18T18:55:27.537 に答える
2

push_back()コピーを作成します。投稿されたコードでは、nullで終了する文字列へのポインターを渡しているため、C++はポインターのコピーを作成します。その文字列のコピーが必要な場合は、いくつかのオプションがあります。

Cスタイルのnullで終了する文字配列を文字列として使用する場合は、delete []を呼び出さずに、ポインタを渡すだけで済みます。もちろん、C ++には手動のメモリ管理しかないため、後で適切なタイミングで必ずdelete[]を呼び出す必要があります...

他の誰もが言うように、他のオプションは単にstd::stringを使用することです。それはあなたのためにメモリを管理し、ほとんど「うまくいく...」

于 2012-11-18T19:02:57.397 に答える
1

手動でのメモリ管理の失敗は、いつものように失敗します。正気の人のように使用するstd::stringと、プログラムが実際に正しく機能する可能性があることがわかります。

于 2012-11-18T18:57:31.717 に答える