2

これは、このトピックのここでの説明を参照して います。C++関数のoutパラメーターとしてcharポインターを使用する方法

以下のコードでは、pTempのメモリをどこで解放しますか?必須ではありませんか?文字の配列の代わりに整数の配列があったとしたら、とにかく状況は変わったでしょうか?

void SetName( char **pszStr )
{
    char* pTemp = new char[10];
    strcpy(pTemp,"Mark");
    *pszStr = pTemp;
}

int main(int argc, char* argv[])
{
    char* pszName = NULL;
    SetName( &pszName );
    cout<<"Name - "<< pszName << endl;
    delete [] pszName;
    cin.get();
    return 0;
}
4

3 に答える 3

8

に割り当てpTemp*pszStrはをpszStr指しpszNameます。

したがって、delete [] pzxName必要に応じて割り当てられたメモリを削除します。

混乱は、奇妙なCスタイルのイディオムや手動のメモリ管理を避ける必要がある理由の良い例です。それは次のようにはるかに明確になります:

#include <string>
#include <iostream>

std::string GetName() {return "Mark";}

int main() {
    std::string name = GetName();
    std::cout << "Name - " << name << std::endl;
}

ポインタなし、newまたはdelete必須。

于 2012-08-30T10:32:30.453 に答える
3

あなたはする必要はありません。
それに割り当てられたメモリは、次の呼び出し時に割り当てが解除されます。

delete [] pszName; 

new/new []はアドレスを返すことに注意してください。メモリリークを回避するには、まったく同じアドレスdelete/を1回だけ呼び出す必要があります。 delete []

上記のコードにあるのは、によって返された同じアドレスを指す2つの異なるpointers(pszNameおよび)です。したがって、1つを呼び出すだけで十分です。pTempnew []delete []

std::stringC ++では、代わりに使用する方がはるかに優れています。char *他のデータ型の場合は、スマートポインターを使用して、明示的なメモリ管理を節約できます。

于 2012-08-30T10:32:02.013 に答える
1

pTemp、変数自体は、最初にスタックに割り当てられたため、関数が終了すると割り当てが解除されます。ポインタが置かれた配列はpTemp、渡された引数を介して関数の外部に存続しますpszNameこの変数の値が削除されると、配列によって使用されていたヒープメモリが解放されます。

于 2012-08-30T10:32:08.880 に答える