FBIagent
Erfahrenes Mitglied
Guten Tag,
ich habe einige meiner alten Klassen herausgekramt und wollte diese nun ein wenig
verändern. Nur leider scheine ich bei der Speicherverwaltung etwas falsch zu machen.
Ich bekomme einen access violation beim cleanup, wobei der debugger mir sagt,
das alle Zeiger gültig sind.
Wäre schön wenn jemand einen kurzen blick darauf werfen kann.
SqlStatement.hpp
SqlStatement.cpp
Diese Klasse in eine DLL exportiert. Desweiteren benutzt sie:
Nun linke ich in einem Testprojekt meine .lib und benutze die Klasse folgendermaßen:
Wenn das Ende des Gültigkeitsbereiches von Statement erreicht ist am Ende des try
Blocks wird mir angezeigt, dass eine HEAP CORRUPTION vorliegt und ich versuche
Speicher freizugeben der mir nicht gehört. Der Debugger zeigt nun aber an, dass
alle Zeiger gültig sind. Nun verstehe ich nicht was ich falsch gemacht habe.
Best wishes
FBIagent
ich habe einige meiner alten Klassen herausgekramt und wollte diese nun ein wenig
verändern. Nur leider scheine ich bei der Speicherverwaltung etwas falsch zu machen.
Ich bekomme einen access violation beim cleanup, wobei der debugger mir sagt,
das alle Zeiger gültig sind.
Wäre schön wenn jemand einen kurzen blick darauf werfen kann.
SqlStatement.hpp
C++:
class SQLPP_API SqlStatement {
public:
/*
* Description:
* Created the statement
* No nullpointer check
*
* Exception on error:
* std::exception
*
* Return:
* no
*/
SqlStatement( const char *Query );
/*
* Description:
* Cleans the statement
*
* Exception on error:
* no
*
* Return:
* no
*/
virtual ~SqlStatement();
/*
* Description:
* Replaces the first occurence of "?" in m_Query with Number
*
* Exception on error:
* std::exception
*
* Return:
* no
*/
void AddNumber( int Number );
/*
* Description:
* Replaces the first occurence of "?" in m_Query with Str
* No nullpointer check
*
* Exception on error:
* std::exception
*
* Return:
* no
*/
void AddStr( const char *Str );
/*
* Description:
* Returns m_Query
*
* Exception on error:
* no
*
* Return:
* m_Query
*/
const char *GetQuery() const;
private:
char *m_Query;
};
SqlStatement.cpp
C++:
SqlStatement::SqlStatement( const char *Query )
: m_Query( CStr::Copy( Query ) ) {
if ( m_Query == 0 ) {
throw std::exception( "SQL++ Exception: Insufficient memory" );
}
}
SqlStatement::~SqlStatement() {
delete[] m_Query;
}
void SqlStatement::AddNumber( int Number ) {
char *NumberStr = CStr::FromInt( Number );
char *NewQuery = CStr::ReplaceOnce( m_Query, "?", NumberStr );
if ( NewQuery == 0 ) {
throw std::exception( "SQL++ Exception: Insufficient memory" );
}
delete[] NumberStr;
delete[] m_Query;
m_Query = NewQuery;
}
void SqlStatement::AddStr( const char *Str ) {
char *NewQuery = CStr::ReplaceOnce( m_Query, "?", Str );
if ( NewQuery == 0 ) {
throw std::exception( "SQL++ Exception: Insufficient memory" );
}
delete[] m_Query;
m_Query = NewQuery;
}
const char *SqlStatement::GetQuery() const {
return m_Query;
}
Diese Klasse in eine DLL exportiert. Desweiteren benutzt sie:
C++:
char *Copy( const char *Str ) {
char *NewStr = new char[ strlen( Str ) + 1 ];
if ( NewStr == 0 ) {
return 0;
}
strcpy( NewStr, Str );
return NewStr;
}
char *ReplaceOnce( char *Str, const char *SearchStr, const char *Replacement ) {
size_t StrLen = strlen( Str );
size_t SearchLen = strlen( SearchStr );
size_t ReplaceLen = strlen( Replacement );
for ( size_t i = 0;i < StrLen;++ i ) {
if ( i + SearchLen > StrLen ) {
return Copy( Str );
}
if ( StartsWith( Str + i, SearchStr ) ) {
char *NewStr = new char[ StrLen - SearchLen + ReplaceLen ];
if ( NewStr == 0 ) {
return 0;
}
strncpy( NewStr, Str, i );
NewStr[ i ] = '\0';
strcat( NewStr, Replacement );
strcat( NewStr, Str + i + SearchLen );
return NewStr;
}
}
return Copy( Str );
}
Nun linke ich in einem Testprojekt meine .lib und benutze die Klasse folgendermaßen:
C++:
int main( int argc, char *argv[] ) {
try {
/* MySqlConnection Connection( "127.0.0.1", "", "", "", 3306 );*/
SqlStatement Statement( "SELECT * FROM accounts WHERE login='?'" );
Statement.AddStr( "fbiagent" );
std::cout << "Query: " << Statement.GetQuery() << std::endl << std::endl;
/*SqlResult *Result = Connection.ExecuteQuery( &Statement );*/
/* try {
while ( Result->Next() ) {
std::cout << "---- " << Result->GetValue( "login" ) << " ----" << std::endl;
std::cout << "Password: " << Result->GetValue( "password" ) << std::endl;
std::cout << "Last Active: " << Result->GetValue( "lastactive" ) << std::endl;
std::cout << "Access Level: " << Result->GetValue( "accessLevel" ) << std::endl;
std::cout << "Last IP: " << Result->GetValue( "lastIP" ) << std::endl;
std::cout << "Last Server: " << Result->GetValue( "lastServer" ) << std::endl << std::endl;
}
} catch( std::exception &e ) { // no such column
std::cout << e.what() << std::endl;
}*/
/*delete Result;*/
} catch ( std::exception &e ) { // connect failed, insufficient mem, query error
std::cout << e.what() << std::endl;
}
}
Wenn das Ende des Gültigkeitsbereiches von Statement erreicht ist am Ende des try
Blocks wird mir angezeigt, dass eine HEAP CORRUPTION vorliegt und ich versuche
Speicher freizugeben der mir nicht gehört. Der Debugger zeigt nun aber an, dass
alle Zeiger gültig sind. Nun verstehe ich nicht was ich falsch gemacht habe.
Best wishes
FBIagent
Zuletzt bearbeitet von einem Moderator: