0

C++で有効なポインタに問題があります。異なるスレッドで1つのオブジェクトを使用しているため、ポインターをNULLに設定して返すことはできません。これが私が試していることです:

int main()
{
    char *ptr = new char[1024]; //assume PTR = 0x12345678
    changePtr(ptr);  //after calling this,
                     //ptr is not NULL here.
    return 0;
}

void changePtr(char *ptr)
{
    delete [] ptr; //ptr = 0x12345678
    ptr = NULL; //ptr = NULL
}

ptr両方の関数でNULLに変更するにはどうすればよいですか?

4

4 に答える 4

7

changePtrの署名を次のように変更します。

void changePtr(char **ptr)
{
   delete [] *ptr; //ptr = 0x12345678
   *ptr = NULL; //ptr = NULL
}

そして、それを使用して呼び出します:

changePtr(&ptr);
于 2013-03-13T19:27:19.517 に答える
6

C++ では、参照パラメーターを使用します。

void changePtr(char *&ptr) {
    delete [] ptr; //ptr = 0x12345678 
    ptr = NULL; //ptr = NULL 
}

Cでは、ポインターをポインターに渡す必要があります。これは、基本的に同じことですが、構文があまりきれいではありません。

呼び出しコードを変更する必要はありません。ただし、呼び出し時に引数として変更可能な変数を指定する必要があります。たとえばNULL、 またはを指定することはできません。nullptrできないのと同じです&NULL

于 2013-03-13T19:29:13.367 に答える
3

このように複雑でエラーが発生しやすい方法でメモリを管理したい場合は、呼び出し元のポインタのコピーではなく、への参照を渡します。

void changePtr(char *&ptr)
//                   ^

スマートポインタを使用する方がはるかに良いでしょう。ターゲットが削除されたときにぶら下がったままにするのが非常に難しいように設計されています。

int main()
{
    std::unique_ptr<char[]> ptr(new char[1024]); //assume PTR = 0x12345678
    changePtr(ptr);  //after calling this,
                     //ptr is empty here.
    return 0;
}

void changePtr(std::unique_ptr<char[]> & ptr)
{
    ptr.reset();
}

ただし、動的配列が必要な場合は、new完全に避けてを使用しますstd::vector

于 2013-03-13T19:31:52.187 に答える
0

ポインターの有効性をチェックする方法について、非常に多くの質問を見てきました。これらの質問の多くは、Windows に関するものです。C++ でチェックインする一般的な方法はないかもしれませんが、Windows 固有のソリューションの場合、私のシステムでは次のように動作するようです。

#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    MEMORY_BASIC_INFORMATION lpBuffer;
    int cActualBytes;

    cActualBytes = VirtualQuery(&main, &lpBuffer, sizeof(lpBuffer));        // Can we get info about main?

    if (!cActualBytes)
    {
        printf("Nope, you can't do that \n");
        return 2;
    }

    if (cActualBytes != sizeof(lpBuffer))
    {
        printf("Surprise!  Expected %d bytes, got %d\n", sizeof(lpBuffer), cActualBytes);
    }


    printf("Information for main\n");
    printf("---------------------------\n");
    printf("C reports pointer %p, Virtual Alloc sees it as %p\n",&main,lpBuffer.BaseAddress);

    return 0;
}
于 2014-05-13T23:11:16.180 に答える