CPP - 未处理的异常 std::bad_alloc
CPP - Unhandled exception std::bad_alloc
亲爱的 Whosebug 用户,
我一直在使用 C++ 进行编码,我参与了一个项目,我从 4D SQL 数据库中读取信息到 MySQL 语法 .sql 文件中,这些文件依次由 MySQL 服务器执行。
我正在 运行 解决以下问题;如果我 运行 使用一个 table 创建 SQL 函数然后退出程序,它 运行 没问题。
如果我循环 CreateSQL 函数以从所有 table 创建 SQL,它会失败并出现 std::bad_alloc 错误。
由于我是 C++ 的新手,我希望是否有一些更有经验的 C++ 程序员可以指出可能发生此错误的方向。
我(没有经验)的猜测是不正确的变量释放或释放时间,如下所示:
SQLFreeHandle( SQL_HANDLE_STMT, hStmt ) ;
SQLFreeHandle( SQL_HANDLE_DBC, hConn ) ;
SQLFreeHandle( SQL_HANDLE_ENV, hEnv ) ;
如有任何帮助,我们将不胜感激。
完整的源代码如下:
编辑:遵循评论中 François 的建议:
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 ) ;
}
}
std::bad_alloc
在分配内存失败时被 new
抛出,通常是因为内存耗尽,这通常表示程序中某处存在内存泄漏。
你的函数 createInsert
和 createSelect
都充满了你没有的动态分配 delete
:
char * array = new char[array_size];
而不是像这样动态分配,你应该使用 std::string
和 operator>>
从 ifstream
中提取并避开任何动态分配,总有比手动分配。
旁注,while(!file.eof())
总是不好的。
亲爱的 Whosebug 用户,
我一直在使用 C++ 进行编码,我参与了一个项目,我从 4D SQL 数据库中读取信息到 MySQL 语法 .sql 文件中,这些文件依次由 MySQL 服务器执行。 我正在 运行 解决以下问题;如果我 运行 使用一个 table 创建 SQL 函数然后退出程序,它 运行 没问题。
如果我循环 CreateSQL 函数以从所有 table 创建 SQL,它会失败并出现 std::bad_alloc 错误。
由于我是 C++ 的新手,我希望是否有一些更有经验的 C++ 程序员可以指出可能发生此错误的方向。 我(没有经验)的猜测是不正确的变量释放或释放时间,如下所示:
SQLFreeHandle( SQL_HANDLE_STMT, hStmt ) ;
SQLFreeHandle( SQL_HANDLE_DBC, hConn ) ;
SQLFreeHandle( SQL_HANDLE_ENV, hEnv ) ;
如有任何帮助,我们将不胜感激。
完整的源代码如下:
编辑:遵循评论中 François 的建议:
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 ) ;
}
}
std::bad_alloc
在分配内存失败时被 new
抛出,通常是因为内存耗尽,这通常表示程序中某处存在内存泄漏。
你的函数 createInsert
和 createSelect
都充满了你没有的动态分配 delete
:
char * array = new char[array_size];
而不是像这样动态分配,你应该使用 std::string
和 operator>>
从 ifstream
中提取并避开任何动态分配,总有比手动分配。
旁注,while(!file.eof())
总是不好的。