ошибка глобальной переменной sqlite - PullRequest
3 голосов
/ 02 марта 2011

У меня есть глобальная переменная с именем mob.Когда я печатаю это в первый раз, это то, что я ожидаю: «Волк».Но когда я снова печатаю его в конце main, оно выглядит как «до».Я много отлаживал этот код, и mob является глобальным, поэтому я не понимаю, как его можно изменить.При необходимости я могу добавить комментарии к части кода.

Я использую sqlite3, Visual Studio 2010 и Win 7 x64.

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#include "sqlite3.h"
struct Mob {
    Mob():_name(0),_lvl(0),_loot(0){}

unsigned const char* _name;
unsigned const char* _lvl;
unsigned const char* _loot;

}mob;

void main()
{
    sqlite3 *db;
    sqlite3_stmt * pStmt;
    int i, j, coln, rc;
    int b = 1;

    char *sql[] = {
    "CREATE TABLE tbl (name TEXT,lvl INTEGER,loot TEXT);",
    "INSERT INTO tbl VALUES('Wolf',5,'Meat');",
    "SELECT * FROM tbl;"
    };  

    if (sqlite3_open("exam2.db", &db))
    {
        printf("Error: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        system("pause");
        exit(1);
    }

    for (i=0; i<sizeof(sql)/sizeof(sql[0]); i++)
    {

        if (sqlite3_prepare(db, sql[i], -1, &pStmt, NULL))
        {
            printf("Error: %s\n", sqlite3_errmsg(db));
            sqlite3_finalize(pStmt);
            sqlite3_close(db);
            system("pause");
            exit(1);
        }

        coln = sqlite3_column_count(pStmt);


        while((rc = sqlite3_step(pStmt)) == SQLITE_ROW)
        {

            coln = sqlite3_data_count(pStmt);

            mob._name=sqlite3_column_text(pStmt, 0);
            std::cout<<mob._name<<std::endl; //1

        }

        if (rc != SQLITE_DONE)  printf("Error: %s\n", 
                sqlite3_errmsg(db));

        sqlite3_finalize(pStmt);
    }


    std::cout<<mob._name<<std::endl; //2

    sqlite3_close(db);
    system("pause");
} //end main

1 Ответ

5 голосов
/ 02 марта 2011

Mob::_name - это необработанный указатель, и вы устанавливаете его в строку, которая принадлежит и управляется SQLite. Когда вы попытаетесь снова вывести строку, SQLite уже повторно использовал эту память, поэтому ваша программа работает с неопределенным поведением, и вы видите вывод мусора.

Вы должны глубоко скопировать строку - предпочтительно используя std::string для ее хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...