CPP — необработанное исключение std :: bad_alloc

Уважаемые 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 ) ;

Любая помощь будет принята с благодарностью.

Полный исходный код ниже:

Исходный код

РЕДАКТИРОВАТЬ: Следуя совету Франсуа из комментариев:

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 ) ;
}
}

0

Решение

std::bad_alloc брошен new когда не удается выделить память, обычно из-за исчерпания памяти, что обычно указывает на утечку памяти где-то в вашей программе.

Ваши функции createInsert а также createSelect оба замусорены динамическим распределением, которое вы не делаете delete :

char * array = new char[array_size];

Вместо того, чтобы динамически распределять как это, вы должны использовать std::string а также operator>> извлечь из ifstream и держаться подальше от любого динамического распределения, всегда есть лучший подход, чем ручное распределение.


Примечание, while(!file.eof()) это всегда плохо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]