我不明白的编译器警告 - 可能未初始化的 QStringList
Compiler warning I don't understand - possible uninitialised QStringList
我得到了一段我认为很简单的代码 - 我想将 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->append(baseName);
但其他两个都不是。
这段代码在 class.
的方法中
如果我的项目中没有消除警告,我确实希望至少理解这些警告,但我真的不明白为什么会出现这种情况。
有什么线索吗?
此外,这是将 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_ptr
、std::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
的指针。它不构造一个,也不为其分配任何内存。当你去使用它时,你正在调用 undefined behavior 因为你正在使用一个未初始化的指针。
如果您需要创建指向对象的指针,请使用智能指针而不是原始指针。您可以使用 std::unique_ptr
std::unique_ptr<QStringList> newBOMList = std::make_unique<QStringList>();
我得到了一段我认为很简单的代码 - 我想将 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->append(baseName);
但其他两个都不是。
这段代码在 class.
的方法中如果我的项目中没有消除警告,我确实希望至少理解这些警告,但我真的不明白为什么会出现这种情况。
有什么线索吗?
此外,这是将 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_ptr
、std::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
的指针。它不构造一个,也不为其分配任何内存。当你去使用它时,你正在调用 undefined behavior 因为你正在使用一个未初始化的指针。
如果您需要创建指向对象的指针,请使用智能指针而不是原始指针。您可以使用 std::unique_ptr
std::unique_ptr<QStringList> newBOMList = std::make_unique<QStringList>();