嘿所以我正在使用pdCurses lib和stringStream来计算并制作一个代表时钟的5个字符的长字符串。它显示为00:00,0:00,00:00或0.000。但是当运行我的函数时,我会在这个部分得到一个例外:
if((int)time >= 10)
{
if((int)time >= 60)
{
if((int)time >= 600)
{
例外情况还指出存在访问冲突:
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
为什么这会像if语句一样简单?我该如何解决? 感谢您的帮助! =)这也是我的功能:
//////////////////////////////////////////// Refresh ///////////////////////////
void Refresh()
{
for(int r = 0;r<nrows;r++)
{
move(r,0);
instr((char*)_contents[r].c_str());
} // make sure this works later
// Insert the current time;
enum{ time_loc_y= 24, time_loc_x= 10 };
long float time = myStopwatch.ElapsedTime();
string time_s= " ";
string min; ss << (int)time%60; ss >> min;
string sec; ss << (int)time/60; ss >> sec;
if((int)time >= 10)
{
if((int)time >= 60)
{
if((int)time >= 600)
{
time_s.insert(0, min); // 00:00
time_s.insert(time_s.begin()+2, ':');
time_s.insert(4, sec);
}
else
{
time_s.insert(1, min); // 0:00
time_s.insert(time_s.begin()+2, ':');
time_s.insert(4, sec);
}
}
else
{
ss.precision(2); ss << time; // 00.00
ss >> time_s;
}
}
else
{
ss.precision(3);
ss << time; // 0.000
ss >> time_s;
}
mvinstr(time_loc_y, time_loc_x, (char*)time_s.c_str());
refresh();
}; // end of function
答案 0 :(得分:1)
这是一个内存系统断言,它通常是在堆已经损坏时通过分配内存来触发的。触发器可能是这样的:
time_s.insert(0, min);
然而,问题出在其他地方 - 在某些地方,你要覆盖你不应该的内存。
答案 1 :(得分:1)
这里还没有足够的内容,但我的猜测是断言是来自time_s.insert(0, min)
调用行中的if((int)time >= 600)
调用 - 字符串正在执行一些重新分配和堆已被破坏(可能是函数顶部循环中发生的任何事情,但可能完全在其他地方)。
如果你在调试器中运行它并让它捕获断言,那么调用堆栈是什么样的?
发生了什么:
for(int r = 0;r<nrows;r++){ move(r,0);
instr((char*)_contents[r].c_str());}
答案 2 :(得分:0)
我认为你误解了抛出异常的原因。 ss
定义在哪里?
注意,如果您将代码重新格式化为更规范的样式,例如
if((int)time >= 10){
if((int)time >= 60){
if((int)time >= 600){
time_s.insert(0, min); // 00:00
time_s.insert(time_s.begin()+2, ':');
time_s.insert(4, sec);
} else {
每行一个语句,该异常将更加详细地告诉您哪个语句导致了问题。