编译器警告我不明白 - 可能是未初始化的QStringList

时间:2015-07-30 14:11:14

标签: c++ qt warnings

我认为这是一个简单的代码 - 我想在QStringList中添加3个字符串。这是我的代码:

baseName = "qwerty";
QStringList *newBOMList;

for (auto ii = 0; ii <= 2; ii++)
{
    if (ii == 0) {
      newBOMList->append(baseName);
    }else
    if (ii == 1) {
      newBOMList->append("A");
    }else
    if (ii == 2) {
      newBOMList->append(baseName + " description");
    }
}

我在第一个追加行上收到编译器警告:

&#39; newBOMList&#39;可以在此函数中使用未初始化[-Wyybe-uninitialized]                newBOMList-&GT;附加(baseName的);

但不是其他两个。

这段代码是一个类的方法。

我喜欢至少理解警告,如果没有在我的项目中摆脱它们,但我真的不明白为什么会发生这种警告。

有什么线索吗?

另外,这是将3个字符串添加到QStringList的最佳方法吗?

哦 - 我在Linux机器上使用qt-creator - 如果这有任何区别的话。

2 个答案:

答案 0 :(得分:5)

您创建了一个指向QStringList的指针,但从未实际创建过该对象,因此指针未初始化。

QStringList *newBOMList; //pointer to nowhere, results in error/warning on use
QStringList *newBOMList = new QStringList(); //now you have an actual instance, remember to clear it up with "delete newBOMList "
QStringList newBOMList; //stack/local instance, no need to deallocate

如果您需要动态分配的ID,我强烈建议您查看std::unique_ptrstd::shared_ptr和类似内容,以便为您管理内存。他们负责释放在没有明确delete p的情况下分配的内存。

e.g。编辑你的origenal代码,这些将是选项:

//local/auto allocated
baseName = "qwerty";
QStringList localBOMList;

for (auto ii = 0; ii <= 2; ii++)
{
    if (ii == 0) {
      localBOMList.append(baseName);
    }else
    if (ii == 1) {
      localBOMList.append("A");
    }else
    if (ii == 2) {
      localBOMList.append(baseName + " description");
    }
}

//dynamically allocated, but will be destroyed as soon as the unique_ptr object is so no need for "delete newBOMList" to prevent a memory leak
baseName = "qwerty";
std::unique_ptr<QStringList> newBOMList(new QStringList());

for (auto ii = 0; ii <= 2; ii++)
{
    if (ii == 0) {
      newBOMList->append(baseName);
    }else
    if (ii == 1) {
      newBOMList->append("A");
    }else
    if (ii == 2) {
      newBOMList->append(baseName + " description");
    }
}

答案 1 :(得分:1)

QStringList *newBOMList;创建指向QStringList的指针。它不构造一个,也不为它分配任何内存。当您使用它时,您正在使用未初始化的指针调用 undefined behavior

如果需要创建指向对象的指针,请使用智能指针而不是原始指针。您可以使用std::unique_ptr

std::unique_ptr<QStringList> newBOMList = std::make_unique<QStringList>();