CPP - 未处理的异常std :: bad_alloc

时间:2017-06-27 13:41:15

标签: c++ mysql 4d

亲爱的StackOverflow'ers,

我已经开始使用C ++进行编码了,我参与了一个项目,我将4D SQL数据库中的信息读入MySQL语法.sql文件,然后由MySQL服务器执行。 我遇到了以下问题;如果我用一个表运行CreateSQL函数然后退出程序,它运行正常。

如果我循环使用CreateSQL函数从所有表创建SQL,它会因std :: bad_alloc错误而失败。

由于我是C ++的新手,我希望一些经验丰富的C ++程序员可以指出我可能会出现这种错误的方向。 我的(没有经验的)猜测是不正确的变量释放或时间,如下所示:

SQLFreeHandle( SQL_HANDLE_STMT, hStmt ) ;
SQLFreeHandle( SQL_HANDLE_DBC, hConn ) ;
SQLFreeHandle( SQL_HANDLE_ENV, hEnv ) ;

非常感谢任何帮助。

完整的源代码如下:

Source code

编辑:遵循弗朗索瓦的意见建议:

for( int i = 1 ; i <= numRows ; i++ )
{
// Datatypes
// SQLGetData

char buf[256];
SQLINTEGER numBytes ;
newFile << createInsert(table);
for( int j = 1 ;
  j <= numCols ;
  j++ )
{

  retCode = SQLGetData(

    hStmt,
    j,           // COLUMN NUMBER of the data to get
    SQL_C_CHAR,  // the data type that you expect to receive
    buf,         // the place to put the data that you expect to receive
    255,         // the size in bytes of buf (-1 for null terminator)
    &numBytes    // size in bytes of data returned

  ) ;

    if( CHECK( retCode, "SqlGetData", false ) )
    {
        retCode2 = SQLDescribeColA( hStmt, j, colName, 255, &colNameLen, &dataType, &columnSize, &numDecimalDigits, &allowsNullValues ) ;
        if( CHECK( retCode2, "SQLDescribeCol" ) )
        {
            //cout << dataType << endl;
            if(dataType != 91) {
                newFile << "'" << removeSlashes(removeSpecials(buf)) << "'";
            }
            else if (dataType == 91) {
                newFile << "date_format(str_to_date('" << fixDate(buf) << "', '%d-%m-%Y'),'%Y-%m-%d')";
            }
        }
    //Sleep(50);
    }
    if(j != numCols) {
        newFile << ",";
    }

}
newFile << ");\n";
cout << "Regel #" << i <<  " van tabel " << table << " is verwerkt." << endl;

retCode = SQLFetch( hStmt ) ;
if( !SQL_SUCCEEDED( retCode ) )
{
  cout << "Tabel "+table+" is verwerkt." << endl;
  printf( "Regel %d is de laatste regel.\n", i ) ;
}
}

1 个答案:

答案 0 :(得分:0)

std::bad_alloc无法分配内存时,{p> new会抛出,通常是因为内存耗尽,这通常表示程序中某处存在内存泄漏。

您的功能createInsertcreateSelect都被动态分配所困扰,而您delete

char * array = new char[array_size];

您应该使用std::stringoperator>>ifstream中提取并避开任何动态分配,而不是像这样动态分配,总是有一种比手动分配更好的方法

旁注,while(!file.eof())总是不好。