我正在使用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();
}
我已经尝试了一些事情,但没有成功:
有没有人知道可能发生的事情?
答案 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
。这取决于您的要求。