gpt4 book ai didi

c++ - 访问 vector 元素的成员函数时发生访问冲突

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:25 25 4
gpt4 key购买 nike

我正在使用 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 成为类成员变量

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

最佳答案

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com