|
From: Pete <pe...@ka...> - 2012-06-07 03:40:07
|
Hi Simon,
I'm not familiar with unique_ptr and used auto_ptr instead. I also isolated
db I/O part into a function.
Tell me if this works fine now.
Pete
> -----Original Message-----
> From: Simon Walter [mailto:si...@gi...]
> Sent: Thursday, 7 June 2012 1:09 p.m.
> To: lib...@li...
> Subject: Re: [libodbcxx-devel] segmentation fault help please
>
>
> On 06/06/2012 07:27 PM, Pete wrote:
> >
> > Further to Jan's suggestions, unless you do:
> >
> > odbc::DriverManager::shutdown();
> >
> > before exiting from your program you'll get leaks.
> >
>
> Thanks for that Pete and Jan. I got this error upon exit:
>
> error code: 0
> error message: Failed to shutdown DriverManager:
> [unixODBC][Driver Manager]Function sequence error
>
> As I'd gone back to using unique_ptr, I figured I should
> reset() them in the order Jan specified - which makes sense.
>
> But there is still a memory leak. Is this to be expected? Am
> I looking at something to do with the ODBC libs?
>
> $ valgrind --tool=memcheck --leak-check=full ./testODBCtds
> ==14771== Memcheck, a memory error detector ==14771==
> Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
> ==14771== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun
> with -h for copyright info ==14771== Command: ./testODBCtds ==14771==
> 1
> ==14771==
> ==14771== HEAP SUMMARY:
> ==14771== in use at exit: 5,192 bytes in 201 blocks
> ==14771== total heap usage: 1,788 allocs, 1,587 frees,
> 1,455,615 bytes
> allocated
> ==14771==
> ==14771== 160 (40 direct, 120 indirect) bytes in 1 blocks are
> definitely lost in loss record 192 of 195
> ==14771== at 0x4023F50: malloc (vg_replace_malloc.c:236)
> ==14771== by 0x429C1E3: nss_parse_service_list (nsswitch.c:622)
> ==14771== by 0x429C926: __nss_database_lookup (nsswitch.c:164)
> ==14771== by 0x402AEAB: ???
> ==14771== by 0x402BB6C: ???
> ==14771== by 0x4255994: getpwuid_r@@GLIBC_2.1.2 (getXXbyYY_r.c:253)
> ==14771== by 0x42552FE: getpwuid (getXXbyYY.c:117)
> ==14771== by 0x4378920: ??? (in /usr/lib/libodbc.so.1.0.0)
> ==14771== by 0x4375445: ??? (in /usr/lib/libodbc.so.1.0.0)
> ==14771== by 0x43617FF: ??? (in /usr/lib/libodbc.so.1.0.0)
> ==14771== by 0x43330E2: SQLDriverConnect (in
> /usr/lib/libodbc.so.1.0.0)
> ==14771== by 0x40493FE: odbc::Connection::_connect(std::string
> const&, unsigned short) (connection.cpp:227) ==14771==
> ==14771== LEAK SUMMARY:
> ==14771== definitely lost: 40 bytes in 1 blocks
> ==14771== indirectly lost: 120 bytes in 10 blocks
> ==14771== possibly lost: 0 bytes in 0 blocks
> ==14771== still reachable: 5,032 bytes in 190 blocks
> ==14771== suppressed: 0 bytes in 0 blocks
> ==14771== Reachable blocks (those to which a pointer was
> found) are not shown.
> ==14771== To see them, rerun with: --leak-check=full
> --show-reachable=yes ==14771== ==14771== For counts of
> detected and suppressed errors, rerun with: -v ==14771==
> ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 45 from 10)
>
> code:
>
> #include <string>
> #include <sstream>
> #include <iostream>
> #include <memory>
> #include <odbc++/drivermanager.h>
> #include <odbc++/connection.h>
> #include <odbc++/preparedstatement.h>
> #include <odbc++/callablestatement.h>
> #include <odbc++/resultset.h>
> #include <odbc++/databasemetadata.h>
> #include <odbc++/resultsetmetadata.h>
>
>
> int main(int argc, char** argv)
> {
> int test;
> std::string dbConnectString = "DSN=htms02;UID=cms;PWD=cms1";
> std::stringstream query;
> query << "select 1 as test";
>
> try
> {
> std::unique_ptr<odbc::Connection> connection
> (odbc::DriverManager::getConnection(dbConnectString));
> std::unique_ptr<odbc::Statement> statement
> (connection->createStatement());
> std::unique_ptr<odbc::ResultSet> resultSet
> (statement->executeQuery(query.str()));
>
> while (resultSet->next())
> {
> test = resultSet->getInt("test");
> }
> std::cout << test << std::endl;
>
> resultSet.reset();
> statement.reset();
> connection.reset();
>
> odbc::DriverManager::shutdown();
> }
> catch(odbc::SQLException& e)
> {
> std::cout << std::endl << "error code: "<<
> e.getErrorCode() << std::endl << "error message: " <<
> e.getMessage() << std::endl;
> }
>
> return 0;
> }
>
>
> --
> simonsmicrophone.com
>
> --------------------------------------------------------------
> ----------------
> Live Security Virtual Conference
> Exclusive live event will cover all the ways today's security
> and threat landscape has changed and how IT managers can
> respond. Discussions will include endpoint security, mobile
> security and the latest in malware threats.
> http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
> _______________________________________________
> libodbcxx-devel mailing list
> lib...@li...
> https://lists.sourceforge.net/lists/listinfo/libodbcxx-devel
>
|