-1

Uint8ネストされたクラスを介して型配列にメモリを割り当てようとしています。そうしているときに、ヒープエラーが発生し、 Debug Assertion Errorというウィンドウが表示されると思います。式: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) . 私のコードは次のとおりです。

#include <iostream>
#include "dcmtk/dcmdata/dctk.h"
using namespace std;

class test
{
public:
    int a;
    Uint8 * b;
    test()
    {}
    test(int c)
    {
        a=c;
        b = new Uint8[a];
    }
    ~test()
    {
        delete [] b;
    }
};

class subTest
{
public:
    test h;
    subTest()
    {}
    subTest(test g)
    {
        h=g;
    }
    ~subTest()
    {
    }
};

int main()
{
    subTest f(test(5));
    for(int i=0; i<5; i++)
    {
        f.h.b[i] = Uint8((i*2)+1);
        cout<< int(f.h.b[i])<<endl;
    }

    return 0;
}

私がやっている間違いを見つけることができますか?

ありがとう。

4

3 に答える 3

2

コンストラクターでオブジェクトをコピーする場合:

subTest(test g)
{
    h=g;
}

あなたの場合のようにオブジェクトにポインターが含まれている場合、独自の指定されたコピーコンストラクターtest classでディープコピーを実行する必要があります。新しいストレージを割り当て、配列のコンテンツをそれにコピーします。そうしないと、同じメモリへのポインターを持つ 2 つ (またはそれ以降) のオブジェクトになってしまいます。これが理由です

~test()
{
    delete [] b;
}

エラーが発生します(さらに未定義の動作です)。補足として、「Rule of three」も参照してください。

3 のルール

C++ でポインタの割り当てを 2 回以上解除するとどうなりますか?

于 2013-10-17T13:51:43.590 に答える