异常:std::bad_alloc在内存位置0x00e4df90
exception: std::bad_alloc at memory location 0x00e4df90
我试图构建一个函数,该函数采用包含自定义类对象的字符串和向量作为参数,并返回具有与参数字符串相同的.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>
中的算法,您的问题很可能会消失。
由于您正在寻找具有特定name
的items
对象,因此您需要使用std::find_if
。您提供的谓词将完成比较item_name
和items::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;
}
现场演示
相关文章:
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 无法在 Opencv 中显示图像导致内存位置
- 从十六进制到双的转换始终导致内存位置的 std::out_of_range
- 错误 在测试.exe 0x76C9FD62时出现未经处理的异常:Microsoft C++异常:内存位置0x006FF8
- 错误:内存位置的 std::length_error
- C++不同内存位置中的默认数组值
- 为什么动态分配的两个变量的内存位置不是连续的?
- Boost.进程间内存位置
- 查找编译时构造类的内存位置