编译器警告我不明白 - 可能未初始化的 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 ->附加(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_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
的指针。它不构造一个,也不为它分配任何内存。当你使用它时,你正在调用未定义行为,因为你正在使用未初始化的指针。
如果需要创建指向对象的指针,请使用智能指针而不是原始指针。你可以使用std::unique_ptr
std::unique_ptr<QStringList> newBOMList = std::make_unique<QStringList>();
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 编译器警告我不明白 - 可能未初始化的 QStringList