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

标签 c++ function vector bitmap access-violation

我正在使用 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/

相关文章:

c++ - sqlite3 将数据转换为短数组

c++ - 来自指针的 shared_ptr

algorithm - 使用 for 循环递增值时计算 n 的值

Java 虚函数调用

c++ - Cppcheck Cmake集成: abort build on warning

c++ - 即使启用了 Wextra,gcc 也不会给出比较无符号整数 < 0 的警告

C++函数返回值存储变量问题

java - 直接访问类似于数组的 vector 元素

c++ - 从 map 中检索值的问题(该值是一个 vector )

c++ - 包含另一个 vector 的部分子集的 vector 都指向同一内存