【问题标题】:Uninitialized Local Variable (The variable is an object from a class) - MYSQL未初始化的局部变量(该变量是来自类的对象) - MYSQL
【发布时间】:2015-10-28 22:54:17
【问题描述】:

我使用的是 Windows 10、Visual Studio 2015。

好吧,无论如何,这是我的代码,我收到了这个错误:

uninitialized local variable 'driver'

我只是按照 MySQL 主网站(示例)上的教程进行操作,这似乎发生了,所以有人可以解释为什么这样做或告诉我一个修复方法。 :) 我试图让它成为静态的,它让它通过,直到我点击按钮然后我得到一个无效的写入内存消息。希望这足以让您告诉我发生了什么事。

  LRESULT CALLBACK WndProc(...)
    {
       ...
       switch (LOWORD(wparam))
                    {
                        case SQL_BUTTON_LAUNCH:
                            using namespace sql;
                            Driver *driver;
                            Connection *con;
                            Statement *stmt;
                            ResultSet *res;

                            con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
                            con->setSchema("test");

                            stmt = con->createStatement();
                            res = stmt->executeQuery("SELECT 'Hello World!' AS _message");


                            delete res;
                            delete stmt;
                            delete con;
                            //SQLConnection();
                            break;
                    }

    }

【问题讨论】:

  • 错误信息告诉你所有需要的。注意 int* ip; *ip = 1;给出同样的错误。
  • 我知道我需要给它一个值,但我不知道应该给它什么类型的值。我在调试器中查看了它,驱动程序变量为 NULL(如果我为其分配一个变量,它将编译)。当它尝试使用 Driver->Connect 时,会出现写入内存错误。
  • driver 是一个未初始化的指针。语句driver->connect( ... ); 取消引用指针。该指针指向某处。编译器告诉你,你需要一个 Driver 类型的实例,你永远不会创建它。
  • 这条消息有什么不清楚的地方?

标签: c++ object winapi


【解决方案1】:

你需要添加

driver = get_driver_instance();

打电话之前

driver->connect (..)

否则,Driver *driver; 只是声明一个指针。 它不会被分配一个有效的值。 所以通过它调用connect(..) 会取消引用这个指针,这反过来会导致未定义的行为。 未定义行为的一个特定情况是问题中提到的内存访问冲突错误。

get_driver_instance () 被调用时,它会执行获取有效指针所需的步骤并返回它,然后您可以将其用于连接。

【讨论】:

  • driver 不是 NULL 指针。它有一个不分青红皂白的价值,就像你在之前的句子中写的那样。
  • @IInspectable,你是对的。这是我对语言的草率使用。让我说得更准确。
  • C++ 不知道 "stack" 是什么。然而,它确实引入了未定义行为的概念。取消引用不指向适当类型对象的指针会导致未定义的行为。访问冲突是未定义行为的一种表现形式。未定义的行为也可能意味着代码按预期工作。
  • 我认为出于初始化的目的,C++ 区分静态/全局变量和其他通常分配在堆栈上的变量。第一种类型的变量被初始化为零,而第二种类型则没有。 stackoverflow.com/questions/17783210/…
  • C++ 区分具有静态存储持续时间的对象和不具有静态存储持续时间的对象。具有静态存储持续时间的对象是零初始化的。无论您是取消引用nullptr,还是取消引用未指向适当类型对象的指针,结果都是未定义的行为
猜你喜欢
  • 1970-01-01
  • 2012-10-03
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多