【问题标题】:Access violation when accessing vector element's member function访问向量元素的成员函数时访问冲突
【发布时间】:2013-12-27 19:39:12
【问题描述】:

我正在使用 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();
}

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

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

有人知道可能发生了什么吗?

【问题讨论】:

  • 您需要了解对象的生命周期。您的 Bitmaps 在循环迭代结束时被销毁。然后你就有了指向已经销毁的对象的指针。
  • " vectorImagenes.push_back(&img); " 应该是vectorImages.push_back(&img) 吗?

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


【解决方案1】:

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。这取决于您的要求。

【讨论】:

  • 并非如此。 m_VectorImages 在循环之前被填充。
  • @suspectus 是的,因此“向量中保存的元素的内存存储”不会丢失。元素指向的对象丢失。
  • 好的,谢谢,我明白你的意思了。现在的问题是我该怎么办?我不能使用vector&lt;Bitmap&gt;,因为它在初始化时给我带来了问题。这会是解决方案吗?如果不是,我应该怎么做才能不破坏位图?
  • @suspectus 我不得不在源文件的顶部注释这些行,这不允许我使用 new: #ifdef _DEBUG #define new DEBUG_NEW endif 但现在似乎好好工作。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 2012-01-27
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多