我正在使用 VS2012 编写 MFC 应用程序。
我有一个 Bitmap* vector ,我在 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();
}
我已经尝试了一些方法,但没有成功:
- 用 vector 的大小初始化 vector ,然后将每个位图插入到其相应的位置(希望这是一个分配问题)。
- 使用迭代器进行循环
- 使 vector 成为类成员变量
有人知道可能发生什么吗?
最佳答案
BitMap 对象 img
在循环内的堆栈上定义。指向 img
的指针被插入 vector 中。一旦循环终止, vector 中指针元素指向的内存存储就会丢失。
使用new
(动态内存分配运算符)来存储位图。
for (int i = 0; i < nImages; i++)
{
Bitmap *img = new BitMap(m_VectorImageNames[i]);
vectorImages.push_back(img);
...
}
可能更好(而不是使用原始指针)是使用内存管理指针,例如 std::shared_ptr
。这取决于您的要求。
关于c++ - 访问 vector 元素的成员函数时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20806754/