Уважаемые 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 ) ;
}
}
std::bad_alloc
брошен new
когда не удается выделить память, обычно из-за исчерпания памяти, что обычно указывает на утечку памяти где-то в вашей программе.
Ваши функции createInsert
а также createSelect
оба замусорены динамическим распределением, которое вы не делаете delete
:
char * array = new char[array_size];
Вместо того, чтобы динамически распределять как это, вы должны использовать std::string
а также operator>>
извлечь из ifstream
и держаться подальше от любого динамического распределения, всегда есть лучший подход, чем ручное распределение.
Примечание, while(!file.eof())
это всегда плохо.
Других решений пока нет …