1
class A
{
    char *name;
public:
    A();
    A(char*);
    ~A();
};

A::A()
{

}
A::A(char* s)
{
    int k=strlen(s);
    name=new char[k+1];
    strcpy_s(name,k+1,s);
}
A::~A()
{
    if(name!=NULL)
        delete[] name;
}

int _tmain(int argc, _TCHAR* argv[])
{
    A *v=new A[20];
    delete[] v;
    system("pause");
    return 0;
}

実行時に次のエラーが表示されます: test212.exe の 0x5B987508 (msvcr110d.dll) で未処理の例外: 0xC0000005: 場所 0xCDCDCDC1 を読み取るアクセス違反。 これは明らかにメモリの問題ですが、このコード例で何が起こるか教えていただけますか?

4

2 に答える 2

4

new A[20]デフォルトのコンストラクターを呼び出し、デフォルトのコンストラクターで初期化しませんname。に設定されるとは限りませNULLん。初期化がない場合、delete[] name未定義の動作をします。

于 2013-02-06T19:54:18.083 に答える
2

A *v=new A[20];デフォルトのコンストラクターを介して新しいAオブジェクトを構築しますA::A()。カスタム コンストラクターA::A(char* s)が呼び出されることnameはないため、メモリが割り当てられることはありません。デストラクタが呼び出されると、delete[]そこにないことを記憶しようとしています。その結果、表示される例外が発生します。

于 2013-02-06T19:54:26.323 に答える