我正在开发一个带有SFML的项目,它涉及很多带有很多按钮的菜单,所以我创建了一些函数来获取最少的输入并自动创建和格式化这些按钮。当函数调用已经构造的按钮作为参数时,我的工作非常出色,但是我想简化它以获取字符串,它将用于构造按钮,这些按钮将存储在向量中。当我尝试这样做时,我收到了这个错误:
Unhandled exception at 0x76a7c41f in Menu.exe: Microsoft C++ exception:
std::bad_alloc at memory location 0x003cd0a0..
我在dbgheap.c中指出了这一点:
for (;;)
{
/* do the allocation
*/
here>>> pvBlk = _heap_alloc_dbg_impl(nSize, nBlockUse, szFileName, nLine, errno_tmp);
if (pvBlk)
{
return pvBlk;
}
if (nhFlag == 0)
{
if (errno_tmp)
{
*errno_tmp = ENOMEM;
}
return pvBlk;
}
/* call installed new handler */
if (!_callnewh(nSize))
{
if (errno_tmp)
{
*errno_tmp = ENOMEM;
}
return NULL;
}
/* new handler was successful -- try to allocate again */
}
这是我的代码,以及我更改的内容。
此功能不会出错:
void page::addLeft(int n, ...)
{
va_list left;
va_start(left, n);
for (int i = 0; i < n; i++)
{
leftButtons.push_back(va_arg(left, button));
//takes parameters of type "button", a working custom class
}
va_end(left);
}
这个函数给了我未处理的异常:std :: bad_alloc
void page::addLeft(int n, ...)
{
va_list left;
va_start(left, n);
for (int i = 0; i < n; i++)
{
std::string s = va_arg(left, std::string);
//takes a parameter of type "string" and uses it in the default constructor
//of button. the default constructor for button works.
leftButtons.push_back(button(s));
}
va_end(left);
}
我对SFML很新,但我认为这不是问题所在。任何和所有的帮助表示赞赏。
答案 0 :(得分:2)
va_arg不能使用std :: string。因此,在for循环的第一次迭代之后,我们将引用未知的内存。 使您的示例有效的一种方法如下:
void page::addLeft(int n, ...)
{
va_list left;
va_start(left, n);
for (int i = 0; i < n; i++)
{
std::string s = va_arg(left, const char *);
//takes a parameter of type "string" and uses it in the default constructor
//of button. the default constructor for button works.
leftButtons.push_back(button(s));
}
va_end(left);
}