繁体   English   中英

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

[英]Compiler warning I don't understand - possible uninitialised QStringList

我有一些我认为很简单的代码-我想在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");
    }
}

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

'newBOMList'可以在此函数中未初始化使用[-Wmaybe-uninitialized] newBOMList-> append(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

如果您需要动态分配的内存,Id强烈建议您调查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>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM