1

だから私は宿題の問題に直面していますgetApple- is const であるため、設定できません。つまり、他のプログラムでインスタンス化され解放されたリンゴで が呼び出されるlocallyAllocated = falseたびに、私のデストラクタはメモリを解放しようとし、double をスローしますgetAppleフリーエラー。私は何を間違っていますか、どうすれば修正できますか? 注: 関数、そのパラメーター、および署名は、割り当てのとおりにする必要があります。本当にありがとう!

class poop
{

Apple localApple;
bool locallyAllocated;
void* pointer;

public:
    poop(const Apple &apple)
    {
        //Set our local apple to the apple in the provided address
        localApple = apple;
        locallyAllocated = false;
    }
    poop(string descr)
    {
        localApple.description = descr;
        pointer = maloc(sizeof(localApple);
        localApple.pointer = pointer
        locallyAllocated = true;
    }
    ~poop()
    {
        if(locallyAllocated)
        {
                //This throws a double free error if "getApple" is ever called
            free(pointer);
        }
    }
    void getApple(Apple* apple) const
    {
        if(apple)
        {
            //Copies our local apple into the address of the given apple
            //Because this function is "const", i can't do anything like set "locallyAllocated" to false
            *apple = localApple
        }
    }
}
4

4 に答える 4

0

ここでいくつかの危険なことが起こっています..特に:

poop(const Apple &apple)
{
    //Set our local apple to the apple in the provided address
    localApple = apple;
    locallyAllocated = false;
}

これは、誰かがおそらくapple.pointerあなたの下から解放される可能性があることを意味します。つまり、あなたlocalApple.pointerは無効になります。そのメソッドでもallocを実行し、memcpyデータを処理する必要があります。

ただし、ここにはもっと大きな問題があります...実際には.pointer. 何かを割り当てる必要さえありますか?ポインタの意図は何ですか?

そのままのクラスに満足している場合は、mutableキーワードを確認してください。

于 2013-10-03T11:37:46.180 に答える
0

locallyAllocatedasを宣言mutableすることで、const メソッドでその値を変更できるようになります。locallyAllocated別の最悪の解決策は、動的に割り当てられたブール値として保存することです。

于 2013-10-03T11:38:46.363 に答える