Sorry for the long reply. Been busy with other things. Yeah I initialize my
sqlite3_stmt* pointer in the constructor and de-initialize it in the
destructor. BTW, here's a snippet of my program:

QueryStatement::QueryStatement(sqlite3* dbaseConn, const char* syntax):
                m_SQL_syntax(""),
                m_QueryStmtHandler(NULL),
                m_QueryIndex(0),
                m_IsRow(false),
                m_IsRowDone(false),
                m_IsBoundable(false),
                m_IsResetable(false)
{
  int result = prepare(dbaseConn, syntax); // The usual sqlite3_prepare.
Pointer is stored in: m_QueryStmtHandler.
  if (result != SQLITE_OK)
  {
          throw result;
  }

}

QueryStatement::~QueryStatement()
{
        finalize(); // The usual sqlite3_finalize.
}

I don't see anything wrong with it IMHO. BTW, the error usually occurs if
I combine between sqlite3_exec and the usual sqlite3_prepare -> step ->
finalize steps in the same method. For example: I use sqlite3_exec with
"CREATE TABLE stamps (name char(100) NOT NULL, thumbName char(100),
category_id int NOT NULL, number_picked FLOAT, PRIMARY KEY( name ),
FOREIGN KEY (category_id) REFERENCES asset_category(id_asset) )" and then
initialize the items inside the table with sqlite3_prepare like this:
"INSERT INTO stamps (name, thumbName, category_id, number_picked) values
(?, ?, ?, ?)", bind the values and use a loop to insert all the items. It
usually crashes during the insertion. But if I close the db and re-opened
it again before preparing the "INSERT" statement, it worked flawlessly.
Weird.

Any idea to trace this bug? Anything would be appreciated because I don't
have a clue whatsoever. Thanks.

Pavel Ivanov wrote:
> Do you initialize your sqlite3_stmt* pointer in constructor? Is there
> any corrupting memory code in other parts of your application?
> You know, it's pretty hard to read and debug your application without
> seeing it. But believe us there's nothing wrong with SQLite and
> sqlite3MemFree(), something wrong with your application and so start
> looking from this point of view.
> You can easily debug the problem as long as you already started
> reading SQLite's code: just look what pointer causes the problem, look
> what value it has at the statement initialization, put breakpoint at
> its change and put breakpoint at sqlite3MemFree with this pointer
> value...
>
>
> Pavel
>
> On Tue, Oct 13, 2009 at 11:46 PM,  <ben...@cs.its.ac.id> wrote:
>> Oh yeah, I forgot to tell you that I'm using Visual C++ 2008
>> professional
>> and it always crashes at this:
>>
>> C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\dbgheap.c -
>> function "_free_dbg_nolock", line 1317:
>>        /*
>>         * If this ASSERT fails, a bad pointer has been passed in. It may
>> be
>>         * totally bogus, or it may have been allocated from another
>> heap.
>>         * The pointer MUST come from the 'local' heap.
>>         */
>>        _ASSERTE(_CrtIsValidHeapPointer(pUserData));
>>
>>
>>
>> ben...@cs.its.ac.id wrote:
>>> Well, I'm pretty sure I haven't. FYI, I wrapped the sqlite3_stmt into a
>>> class and only call its sqlite3_finalize on its destructor. So there's
>>> no
>>> way that it would be called twice. Or so I think.
>>>
>>> Pavel Ivanov wrote:
>>>>> The pPrior or p pointer isn't null so it should've been
>>>>> freed without error IMHO. Can anybody tell me what's wrong with it?
>>>>> Thanks
>>>>> a lot in advance.
>>>>
>>>> If "pPrior or p pointer" isn't null but was already freed then double
>>>> free can cause segmentation fault. In other words most probably you're
>>>> calling sqlite3_finalize on already finalized statement.
>>>>
>>>> Pavel
>>>>
>>>> On Tue, Oct 13, 2009 at 5:58 AM,  <ben...@cs.its.ac.id> wrote:
>>>>> Hi there, I'm a new member of the mailing list. Nice to meet you all.
>>>>>
>>>>> BTW, I've got one problem that's been bugging me for weeks.
>>>>>
>>>>> Occasionally (not always), I got a seg fault at "static void
>>>>> sqlite3MemFree(void *pPrior)". It happened when I do sqlite3_reset or
>>>>> sqlite3_finalize. The pPrior or p pointer isn't null so it should've
>>>>> been
>>>>> freed without error IMHO. Can anybody tell me what's wrong with it?
>>>>> Thanks
>>>>> a lot in advance.
>>>>>
>>>>>
>>
>>
>> Fare thee well,
>> Bawenang R. P. P.
>>
>> ----------------
>> "If a picture is worth a thousand words, an animations is worth a
>> thousand
>> pictures. And to take that a step further, a game is worth a thousand
>> animations." – Peter Raad, Executive Director, The Guildhall at SMU
>>
>>
>> --
>>
>> http://www.its.ac.id
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>


Fare thee well,
Bawenang R. P. P.

----------------
"If a picture is worth a thousand words, an animations is worth a thousand
pictures. And to take that a step further, a game is worth a thousand
animations." – Peter Raad, Executive Director, The Guildhall at SMU


--

http://www.its.ac.id 
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to