1

私はポインタのベクトルを持っています..

std::vector に格納されているポインターを介して Image オブジェクトにアクセスしたいと考えています。イテレータがオブジェクトを見つけた後、ベクトル内のポインターが指す Image オブジェクトの特定のメンバーにアクセス/変更したいと考えています。

助けてください !!


class Image;
typedef std::vector <Image*> VecImages;
typedef VecImages::iterator ImagesIter;

class My_Images
{
        private:
            VecImages m_Images;

        public:
            My_Images() {}
            ~My_Images();

            void addImage(Image* img) {m_Images.push_back(img);}
            Image* getImage(string& rID);
};

// get image method
Image* My_Images::getImage(string& rID)
{
    ImagesIter foundImg = m_Images.begin();

    while (foundImg != m_Images.end()) {
        Image* img = *foundImg;      ***<<<<----------- [EXC_BAD_ACCESS is reported here]***
        const string &strID = img->get_strRId();
        if (strID == rID) {
            return (*foundImg);
        }
        ++foundImg;
    }

    return NULL;
}

// get-id method
const string& Image::get_strRId(void) {return m_strRId;}

// copy constructor
Image::Image(const Image& _src)
    :   m_strRId(_src.m_strRId)
{}

builder という名前の別のクラスがあり、そこで addImage() メソッドを次のように呼び出しています ... My_Images *m_images; (私はこの「新規」を作成します) Image *currImg = new Image; currImg->setName("ABC"); ...そして、他のいくつかの 'set' 関数が currImg で呼び出されます (主に std::string の設定)。

そして、次の呼び出しを使用してベクターに追加します。

m_images->addImage(currImg);

そして、これがベクトルに格納されると、所有権を放棄します。currImg = NULL;


template <class _Type>
_Type* ChAutoPtr<_Type>::giveUpOwnership()
{
#ifdef VERIFY_WITH_SHADOW_STACK
    // Check to see if the last auto-ptr is the one that is being
    // given up!!!
    if (m_pInstance != NULL)
    {
        void* pTop = g_cleanupStackShadow.top();
        ChASSERT(pTop == m_pInstance);
        g_cleanupStackShadow.pop();
    }
#endif /* _DEBUG */

    _Type* pTmp = m_pInstance;
    m_pInstance = NULL;
    return pTmp;
}
4

1 に答える 1

2

EXC_BAD_ACCESS は、(1) 初期化されていないオブジェクトをベクターに追加したか、(2) その寿命が短く、getImage() の呼び出し前に存在しなくなったことを意味します。NSZombies を有効にするか、ベクターに追加された画像の寿命と範囲を確認してみてください。できれば、スマート ポインター (shared_ptr など) を使用してみてください。

于 2012-07-23T13:52:52.160 に答える