【发布时间】:2013-10-26 01:23:09
【问题描述】:
这个程序按预期工作:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Thumbnail
{
string tag;
string fileName;
};
int main()
{
{
Thumbnail newThumbnail;
newThumbnail.tag = "Test_tag";
newThumbnail.fileName = "Test_filename.jpg";
std::vector<Thumbnail> thumbnails;
for(int i = 0; i < 10; ++i) {
thumbnails.push_back(newThumbnail);
}
}
return 0;
}
如果我将主代码块复制并粘贴到另一个项目(仍然是单线程)中,在任何函数中,我都会从注释 // <-- crash at the 2nd loop 的行中得到这个异常:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
如果我在任何 push_back 之前清除向量,一切都很好(但这当然不是所需的行为);这让我觉得这就像向量不能存储多个这样的对象。
这是代码崩溃的函数:
int ImageThumbnails::Load(const std::string &_path)
{
QDir thumbDir(_path.c_str());
if(!thumbDir.exists())
return errMissingThumbPath;
// Set a filter
thumbDir.setFilter(QDir::Files);
thumbDir.setNameFilters(QStringList() << "*.jpg" << "*.jpeg" << "*.png");
thumbDir.setSorting(QDir::Name);
// Delete previous thumbnails
thumbnails.clear();
Thumbnail newThumbnail;
///+TEST+++
{
Thumbnail newThumbnail;
newThumbnail.tag = "Test_tag";
newThumbnail.fileName = "Test_filename.jpg";
std::vector<Thumbnail> thumbnails;
for(int i = 0; i < 10; ++i)
{
TRACE << i << ": " << sizeof(newThumbnail) << " / " << newThumbnail.tag.size() << " / " << newThumbnail.fileName.size() << std::endl;
//thumbnails.clear(); // Ok with this decommented
thumbnails.push_back(newThumbnail); // <-- crash at the 2nd loop
}
exit(0);
}
///+TEST+END+++
...
这是输出:
> TRACE: ImageThumbnails.cpp:134:Load
0: 8 / 8 / 17
> TRACE: ImageThumbnails.cpp:134:Load
1: 8 / 8 / 17
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
为什么在两个不同的项目中,同一段代码会出现这种不同的行为?
平台:Windows 7、MinGW 4.4、GCC
【问题讨论】:
-
您确定您的程序没有崩溃,而其他程序正在发生其他事情吗?例如在另一个线程中?
-
这道题和测试用例都不行!
-
你在其他项目中对
Thumbnail有同样的定义吗? -
@itwasntpete:是的,我是。它是一个单线程应用程序。
-
另一个程序中的某个地方很可能存在内存损坏,当您在其中添加
std::vector时,这会表现出来。
标签: c++ vector crash push-back