EXC_BAD_ACCESS, when accessing the object pointed by the vec

EXC_BAD_ACCESS, when accessing the object pointed by the vector of pointers

本文关键字:the object pointed vec by when BAD ACCESS EXC accessing      更新时间:2023-10-16

我有一个指针向量。。

我想通过存储在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=新图像;currImg->setName("ABC")。。。并且在currImg上调用了其他几个"set"函数(主要设置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;
}

EXC_BAD_ACCESS意味着您(1)将未初始化的对象添加到向量中,或者(2)它的寿命很短,并且在调用getImage()之前就不存在了。您可以尝试启用NSZombies或验证添加到矢量的图像的寿命和范围。最好尝试使用智能指针(例如shared_ptr)。

相关文章: