1

このプログラムは期待どおりに動作します。

#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

2 つの異なるプロジェクトの同じコードに対して、このように異なる動作が発生するのはなぜですか?

プラットフォーム: Windows 7、MinGW 4.4、GCC

4

2 に答える 2

1

別のアプリケーションでまったく同じコードを使用しているときにクラッシュする場合は、プログラムがメモリ不足である可能性があります (これが原因で std::bad_alloc 例外が発生する可能性があります)。他のアプリケーションが使用しているメモリ量を確認してください。

別のこと... std::vectors を使用するときに reserve() メソッドを使用すると、ベクトルにプッシュされる要素の数が事前にわかります。まったく同じ要素を 10 回プッシュしているようです。デフォルトのオブジェクト パラメータを含む resize() メソッドを使用しないのはなぜですか?

于 2013-10-17T14:21:18.063 に答える