访问vector element的成员函数时访问冲突

时间:2013-12-27 19:39:12

标签: c++ function vector bitmap access-violation

我正在使用VS2012编写MFC应用程序。

我有一个Bitmap*的向量,我在for循环中插入元素,然后,如果我尝试在循环外部访问某个元素的函数,它将给我一个访问冲突。

奇怪的是,如果我尝试在循环内部访问它,它就可以正常工作。

在两个示例m_VectorImageNames中已经填充了一些图像文件路径,这不是问题。

以下代码给出了访问冲突(在最后一行):

std::vector<Bitmap *> vectorImages;

for (int i = 0; i < nImages; i++) 
{
    Bitmap img(m_VectorImageNames[i]);

    vectorImages.push_back(&img);
}

int imgWidth= vectorImages[0]->GetWidth();

如果我将GetWidth放在循环中,它将返回正确的值:

std::vector<Bitmap *> vectorImages;

for (int i = 0; i < nImages; i++) 
{
    Bitmap img(m_VectorImageNames[i]);

    vectorImages.push_back(&img);

    int imgWidth= vectorImages[0]->GetWidth();
}

我已经尝试了一些事情,但没有成功:

  • 使用它将具有的大小初始化向量,然后将每个位图插入其相应的位置(希望这是一个分配问题)。
  • 使用迭代器循环
  • 使向量成为类成员变量

有没有人知道可能发生的事情?

1 个答案:

答案 0 :(得分:4)

BitMap对象img在循环内的堆栈上定义。指向img的指针被推入向量中。然后,一旦循环终止,指针元素指向向量中的存储器存储就会丢失。

使用new(运算符进行动态内存分配)来存储位图。

for (int i = 0; i < nImages; i++) 
{
    Bitmap *img = new BitMap(m_VectorImageNames[i]);
    vectorImages.push_back(img);
    ...
}

可能更好(而不是使用原始指针)将使用内存管理指针,如std::shared_ptr。这取决于您的要求。