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

exception: std::bad_alloc at memory location 0x00e4df90

本文关键字:内存 位置 0x00e4df90 std bad 异常 alloc      更新时间:2023-10-16

我试图构建一个函数,该函数采用包含自定义类对象的字符串和向量作为参数,并返回具有与参数字符串相同的.name字符串成员的向量元素。我所编写的函数如下,只要我不尝试在不存在的道具上使用游戏中的"get object"功能,它就能工作。如果这样做,程序就会崩溃,并在标题中显示运行时错误。我不确定是什么原因导致这个错误,有人能指出这个错误吗?我试过确保所有的路径在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] << ".nn";
    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;
    }
}

谢谢。

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

由于您正在寻找具有特定nameitems对象,因此您需要使用std::find_if。您提供的谓词将完成比较item_nameitems::name的工作。

在c++ 11中,这是非常容易的,编写一个lambda表达式来完成这项工作。

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的引用,并重载operator()来执行比较。这正是编译器在上面的c++ 11版本中所做的幕后工作。

struct comparer
{
    comparer(std::string const& item_name) : item_name(item_name) {}
    bool operator()(items const& it) const { return it.name == item_name; }
    std::string const& item_name;
};
items string_to_item( string item_name, const vector<items>& item_container )
{
    comparer comp(item_name);
    std::vector<items>::const_iterator result = 
        std::find_if(item_container.begin(), item_container.end(), comp);
    if(result == item_container.end()) {
        if(item_container.size() == 0) {
            std::cout << "no elements in vector  ( get_item )";
        }
        return items("null");
    }
    return *result;
}

现场演示