c++ - EXC_BAD_ACCESS,访问指针 vector 指向的对象时

标签 c++ unix stl vector exc-bad-access

我有一个指针 vector ..

我想通过存储在 std::vector 中的指针访问我的 Image 对象。在迭代器找到我的对象后,我想访问/修改 vector 中指针指向的 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() 方法,如下所示... 我的图片*m_图片; (我创建了这个"new") 图片 *currImg = 新图片; currImg->setName("ABC"); ...以及在 currImg 上调用了其他几个“设置”函数(主要是设置 std::string's)。

然后我使用以下调用将其添加到 vector 中。

m_images->addImage(currImg);

一旦它被存储在 vector 中,我就放弃了它的所有权。 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) 将未初始化的对象添加到 vector 中,要么 (2) 它的生命周期很短,并且在调用 getImage() 之前不复存在。您可以尝试启用 NSZombies 或验证添加到 vector 的图像的生命周期和范围。最好尝试使用智能指针(例如 shared_ptr)。

关于c++ - EXC_BAD_ACCESS,访问指针 vector 指向的对象时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11612030/

相关文章:

c++ - 你的 C++ 备忘单上有什么?

c++ - Eclipse for C++中的Visual Studio工具链

linux - 在 Unix 中显示以 n 结尾的姓氏

c++ - 避免针对特定异常的析构函数调用

c++ - 使用纯虚函数在两个或多个库之间共享一个类的功能

c++ - vector 的 std::remove 和删除之间的区别?

c++ - 是否可以将 std::vector 放置到共享内存中?

c++ - STL 容器 : Constructor's Allocator parameter and scoped allocators

python - 在不创建序列文件的情况下运行 BLAST (bl2seq)

linux - Unix 按列整数过滤