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

Compiler warning I don't understand - possible uninitialised QStringList

本文关键字:初始化 QStringList 警告 明白 编译器      更新时间:2023-10-16

我已经得到了我认为是一个简单的代码-我想添加3个字符串到QStringList。下面是我的代码:

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");
    }
}

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

'newBOMList'可以在未初始化的情况下使用[-Wmaybe-uninitialized]newBOMList ->附加(baseName);

而不是其他两个

这段代码位于类的方法中。

我确实希望至少能理解这些警告,如果不是在我的项目中去掉它们的话,但是我真的不明白为什么会出现这种情况。

有什么线索吗?

另外,这是最好的方式来添加3个字符串到QStringList?

哦-我在linux上使用qt-creator -如果这有什么区别的话。

您创建了一个指向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

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

。编辑您的原始代码,这些将是选项:

//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");
    }
}

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

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

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