1

このコードの何が問題になっていて、どうすれば修正できますか?

#include <iostream>
#include <boost/shared_ptr.hpp>
#include <vector>

struct CTest
{
    CTest()
    { std::cout << "ctor CTest" <<std::endl; }

    ~CTest()
    { std::cout << "dtor CTest" <<std::endl; }
};

struct CSlot
{
    CSlot() : m_test(new CTest()), m_num(123)
    { }

    ~CSlot()
    {
        // m_test.reset(); // this line fixed the code but I don't know why
        m_num = -1;
    }

    boost::shared_ptr<CTest> m_test;
    int m_num;
};

int main()
{
    std::vector<CSlot> testVector(1);

    std::cout << "1" << std::endl;
    new (&testVector[0]) CSlot();

    // clear slot
    testVector[0].~CSlot();
    std::cout << "2" << std::endl;
}

このコードは機能しているように見え、次のように出力されます。

ctor CTest
1
ctor CTest
dtor CTest
2

しかし、プログラムがクラッシュし、valgrindが常に次のように言うことがあります。

==13372== Invalid read of size 4
==13372==    at 0x400D8F: boost::detail::atomic_exchange_and_add(int*, int)
...

この動作はm_test.reset()行で修正できますが、もっと正しい解決策があると思います...

4

1 に答える 1

6

あなたがしていることは意味がないからです。オブジェクトを作成してから...同じアドレスにオブジェクトを作成します。

次に、そのアドレスのオブジェクトを破棄します...そして再び破棄します。

それはどのように機能するはずですか?

CSlotあなたはオブジェクトのベクトルを求めたので、それがあなたが得たものです。サイズ1を要求したためCSlot、完全に構築され、すぐに使用できる1つのオブジェクトが含まれています。CSlotしたがって、その上にオブジェクトを作成することは意味がありません 。

char新しい配置を使用してデストラクタを直接呼び出す場合は、空のバッファに配置する必要があります。

于 2011-12-29T10:12:31.797 に答える