异常:std :: bad_alloc在内存位置0x00e4df90

时间:2014-06-09 20:43:45

标签: c++ runtime-error

我正在尝试构建一个函数,该函数将包含自定义类对象的字符串和向量作为参数,并返回具有与参数字符串相同的.name字符串成员的向量元素。我编写的函数如下所示,只要我不尝试在不存在的项目上使用游戏“获取对象”功能。如果我这样做,程序崩溃与标题中的运行时错误。我不确定导致此错误的是什么,有人可以指出错误吗?我已经尝试确保string_to_item中的所有路径都返回一个项类型但是没有用。另一件有趣的事情是,break实际上永远不会导致for循环停止,它只会持续到最后。

items string_to_item( string item_name, const vector<items>& item_container ) {
    if ( item_container.size() > 0 ) {
        for (int i = 0; i < item_container.size(); ++i) {
            if ( item_container[i].name == item_name ) {
                return item_container[i];
                break;
            }
            else
                cout << "No such item found";
        }
    }

    else
        return items("null");

    if ( item_container.size() == 0) 
        cout << "no elements in vector  ( get_item )";
}

调试器调用堆栈在崩溃时指向此:

KernelBase.dll!74b01d4d() 

调用此函数和涉及的类的其他函数是:

void get(const vector<string>& input_tokens, vector<items>& global_item_list) {
        player_inventory.get_item( string_to_item( input_tokens[1], global_item_list) );
    cout << "You have picked up a " << input_tokens[1] << ".\n\n";
    remove_from_world( string_to_item( input_tokens[1], global_item_list), global_item_list);
}   

void inventory::get_item( items name ) {
        contents.push_back(name);
}

struct items {
    string name;
    char type;
    string description;
    items() {
        name = " ";
        type = ' ';
        description = " ";
    }
    items( string n )
        : name(n) {}
    items( string n, char t, string d )
        : name(n), type(t), description(d) {}
    bool operator()( const items& one, const items& two ) const {
        return one.name.compare(two.name) < 0;
    }
};

void remove_from_world( items full_def, vector<items>& global_item_list ) {
    vector<items>::iterator it = find( global_item_list.begin(), global_item_list.end(),full_def);
    int i = distance(global_item_list.begin(), it);
    if (it != global_item_list.end())
        global_item_list.erase(global_item_list.begin() + i);
else {
        cout << "remove from world failure";
        return;
    }
}

感谢。

1 个答案:

答案 0 :(得分:3)

我没有调试你的代码,因为你不应该编写像这样的循环,就像在容器中查找项目一样简单。使用<algorithm>中的算法,您的问题很可能会消失。

由于您正在寻找具有特定items的{​​{1}}对象,因此您需要使用std::find_if。您提供的谓词将完成将nameitem_name进行比较的工作。

使用C ++ 11,这非常简单,编写一个可以完成工作的lambda表达式。

items::name

如果您正在使用较旧的编译器,那么任务就会变得更加冗长。最简单的选择是创建一个存储器,该存储器存储对items string_to_item( string item_name, const vector<items>& item_container ) { auto result = std::find_if(item_container.begin(), item_container.end(), [&](items const& it) { return it.name == item_name; }); if(result == item_container.end()) { if(item_container.size() == 0) { std::cout << "no elements in vector ( get_item )"; } return items("null"); } return *result; } 的引用并重载item_name以执行比较。这正是编译器在上面的C ++ 11版本中幕后所做的事情。

operator()

Live demo